题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
标准板子
mark是用来标记对应位置元素有没有被使用过的,至于用map…纯粹是vector传参会出错,不明原因,有知道的大佬求告知~
class Solution {
public:
void backtrack(int n ,vector<int>&nums,map<int, int>&mark,vector<vector<int>> & res,vector<int>&tmp,int count){
if(count == n){
res.push_back(tmp);
return;
}
for(int i = 0;i < n;++i){
if(mark[i] == 1)continue;
//如果是有重复,这里加入判断去重:
//if(i > 0 && nums[i - 1] == nums[i] && mark[i - 1] ==false)continue;
mark[i] = 1;
tmp.push_back(nums[i]);
//回溯关注点,类似题目在这里做改造即可
backtrack(n,nums,mark,res,tmp,count+1);
mark[i] = 0;
tmp.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
vector<vector<int>>res;
vector<int>tmp;
map<int, int>mark;
sort(nums.begin(),nums.end());
backtrack(n,nums,mark,res,tmp,0);
return res;
}
};
可以使用板子的题目
至少有:
Leetcode(39)(40)(46)(47)(78)(90)