解决思路:
排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;
全排列:当n==m时,称为全排列;
比如:集合{ 1,2,3}的全排列为:
{ 1 2 3}
{ 1 3 2 }
{ 2 1 3 }
{ 2 3 1 }
{ 3 2 1 }
{ 3 1 2 }
我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;
算法思路:
(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);
(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;
(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
generate(nums, result, 0, nums.size() - 1);
return result;
}
void generate(vector<int>& nums, vector<vector<int>> &result, int begin, int end)
{
if(begin == end) //如果已经到了最后一个元素,全排列只有自己,故返回
{
result.push_back(nums);
return;
}
else
{
//不断交换元素进行全排列
for(int i = begin; i <= end; i++)
{
swap(nums[begin], nums[i]);
generate(nums, result, begin + 1, end); //对numns[begin + 1, end]进行全排列
swap(nums[begin], nums[i]);
}
}
}
};