找到下一个排列的算法
从数组的尾部开始找到第一个非递增的,然后把该数后面的进行翻转。再找到第一个比它大的,交换它们的位置,即为下一个排列。通过它可以找到全排列(无论包不包含重复元素)
void nextPermutation(vector<int>& nums) {
int n = nums.size();
int i = n - 2;
for(; i >= 0; --i)
{
if(nums[i] < nums[i + 1])
break;
}
reverse(nums.begin() + i + 1, nums.end());
if(i != -1)
for(int j = i + 1; j < n; ++j)
if(nums[j] > nums[i])
{
swap(nums[i], nums[j]);
break;
}
}
可以通过回溯算法找到不存在重复元素的数组的全排列
依次放入元素,标记每个元素是否被放入。若未放入则可以放入,然后进行下一步。放置完毕后,恢复成未放入状态。
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> result;
vector<int> temp(n, 0);
vector<int> status(n, 0);
dfs(0, n, temp, result, nums, status);
return result;
}
void dfs(int cur, int n, vector<int> & temp, vector<vector<int>> & result, vector<int>& nums, vector<int> & status)
{
if(cur == n)
{
result.push_back(temp);
return;
}
for(int i = 0; i < n; ++i)
{
if(!status[i])
{
status[i] = 1;
temp[cur] = nums[i];
dfs(cur + 1, n, temp, result, nums, status);
status[i] = 0;
}
}
}
还可以采用交换元素的方式,不需要额外的内存空间。或者迭代的方法。