本题源自leetcode 46
—————————————————————————
思路:回溯法
1 对数组排序,2定义回溯函数 3 定义递归结束条件,即起始位置大于等于数组大小。 4 每次交换俩个数,递归后在交换回来,保证下次递归。
代码
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
int n = nums.size();
if(n == 0)
return res;
sort(nums.begin(),nums.end());
backPath(nums,res,0);
return res;
}
void backPath(vector<int>& nums,vector<vector<int>>& res,int start){
if(nums.size() <= start){
res.push_back(nums);
return;
}
for(int i = start; i < nums.size(); i++){
swap(nums[start],nums[i]);
backPath(nums,res,start + 1);
swap(nums[start],nums[i]);
}
}
2 给定可能包含重复的数字的集合,返回所有可能的唯一排列。
去重复,只交换一次
代码:
void recursion(vector<int> num, int start, vector<vector<int> > &res) {
if (start == num.size()) {
res.push_back(num);
return;
}
for (int k = start; k < num.size(); k++) {
if (start != k && num[start] == num[k])
continue;
swap(num[start], num[k]);
recursion(num, start+1, res);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> >res;
recursion(num, 0, res);
return res;
}
思路2
void recursion(vector<int> nums, int start, vector<vector<int> > &res) {
if (start == nums.size()) {
res.push_back(nums);
return;
}
unordered_set<int> mp;
for (int k = start; k < nums.size(); k++) {
if(mp.count(nums[k]) > 0)
continue;
mp.insert(nums[k]);
swap(nums[start], nums[k]);
recursion(nums, start+1, res);
swap(nums[start], nums[k]);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> >res;
recursion(num, 0, res);
return res;
}