网上搜索全排列都是递归的方法,感觉虽然理解的递归的思想,但真正拿来写代码的时候总觉得不是那么个事情。既然能递归那么一般都是能够反过来递推的,然后自己琢磨了一下递推的方法。
思路:
递归是全部开始,那递推就是从0开始,其实就是插空的思想,在前一个全排列的基础上,插空出新的全排列
例如:1,2,3,4
step1: 1
那么它的空位就是 空1 1空
这里空位就可以用2来代替
得到我们新的全排列 21 12
step1: 21 12
空位:空21 2空1 21空 空12 1空2 12空
空位用3来代替
得到新的全排列: 321 231 213 312 132 123
….
以此类推
感觉递推的思想比递归的思想差不多,但是更好理解和写代码,感觉不同点可能是要自己去申请内存。
代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution
{
public:
vector<string> perm(int *input,unsigned int n)
{
vector<string> result;
if (n == 0)
return result;
for (int i=0;i<n;i++)
{
insertresult(result,input[i]);
}
return result;
}
private:
void insertresult(vector<string> &result, int nowinsert)
{
if (result.empty())
{
result.resize(1);
result[0]+= to_string(nowinsert);
return;
}
int nowfornum = result.size() - 1;
int nowposition = result.size() * (1 + result[0].size());
result.resize(nowposition);//动态申请空间,其实也可以最开始有输入的时候直接申请所有的空间
for (int i= nowfornum;i>=0;i--)//从后向前,防止顶掉数据
{
int insertmax = result[i].size() + 1;
for (int j=0;j < insertmax;j++)
{
string nowstring = result[i];
nowstring.insert(j, to_string(nowinsert));
result[--nowposition] = nowstring;
}
}
}
};
int main()
{
int input[4] = { 1,2,3,4 };
Solution solution;
vector<string> result = solution.perm(input, 4);
for (auto a: result)
{
cout << a << endl;
}
return 0;
}