给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思路:先举个栗子,如果我们要全排列[1,2,3],那么应该怎么做呢?我们应该先固定第一个数,然后固定第二个数,然后第三个数,第四个数。
第一个数的选择范围:1,2,3 当我们固定了任意一个数字以后,对于剩下的第二三个数,是剩下的数的全排列。比如1,[2,3]表示固定1的[2,3]的全排列
所以所有的情况有:[1,2,3]=
1,[2,3]
2,[1,3]
3,[1,2]
然后对于括号里的全排列,再展开:
[2,3]=2,[3]
=3,[2]
......剩下的以此类推。
所以我们初始化left=0,然后遍历left,直到left<nums.size(),每次交换当前left和其后的所有值sqap(nums[left],nums[i])(left<=i<nums.size()),当left==nums.size()时,加入到res中。
参考代码:
class Solution {
public:
void permuteCore(vector<int>& nums,int start, vector<vector<int>> &res) {
if (start == nums.size()) {
res.push_back(nums);
}
for (int i = start; i < nums.size(); i++) {
swap(nums[start], nums[i]);
permuteCore(nums, start + 1, res);
swap(nums[start], nums[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
if (!nums.size()) return res;
permuteCore(nums, 0,res);
return res;
}
};