20.12. 8 46. 全排列 中等
题目
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
- 全排列做过基本上都会解了。做过两种全排列,第一种是给定数字,每个数字用一次进行全排列;第二种是给定数字,每个数字不限次数进行全排列。这道题是第一种全排列
- 写过几次第二种全排列,一开始没认真思考几十秒就把第二种敲上去,运行一看发现结果不对劲,才发现是第一种。
- 换成第一种,因为不熟悉,第一次ac了但是循环写多了一层,时间复杂度爆炸
- 思路就是,对于当前位置,后面每一个数字都有机会在当前位置,因为每个数字只出现一次,所以用swap把当前位置的数字和后面选中数字交换即可,递归出来之后再swap回来
代码
class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> permute(vector<int>& nums) {
recursion(0, nums);
return ans;
}
void recursion(int curr, vector<int>& nums){
if(curr == nums.size()){
ans.push_back(nums);
return;
}
for(int i = curr; i < nums.size(); ++i){
swap(nums[i], nums[curr]);
recursion(curr+1, nums);
swap(nums[i], nums[curr]);
}
}
};