题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
全排列函数 qpl,传入一个参数n,代表当前交换的首元素,然后遍历交换其与剩下的元素,每次交换之后,调用qpl函数,传入n+1,即 qpl 目前交换元素后剩下的位数的全排列,然后再交换回来。当交换到最后一位,传入结果集中。
代码
class Solution {
public:
vector<vector<int> > ans;
void qpl(vector<int>& nums, int n,vector<vector<int> > &ans)
{ // n 为 交换的首位元素
if(n==nums.size()) { // 返回条件 不能再交换了
ans.push_back(nums);
return ;
}
for(int i=n; i<nums.size(); i++) //交换首位元素和(包括其本身)后面的元素
{ //为什么要包括其本身呢,因为要 qpl 后面的元素,你可以试试 i=n+1开始
swap(nums[n],nums[i]);
qpl(nums, n+1,ans);
swap(nums[n],nums[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
qpl(nums,0,ans);
return ans;
}
};
其他
可能写的不是很好,多多见谅,欢迎指导。网上没找到太多C++的写法,所以来写一下。