给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
>>回溯三部曲:
1).确定回溯函数参数
注意:{1,2} 和 {2,1} 是不同的排序组合,因为排序不同;但 {1,2} 和 {2,1} 是相同的组合,因为元素相同。所以处理组合问题需要 startIndex,处理排列问题就不用使用 startIndex 了
vector> result;
vector path;
void backtracking(vector& nums,vector& used)
2).递归的终止条件
if(path.size() == nums.size()) {
result.push_back(path);
return;
}
3).单层搜索的逻辑
nums 是
可包含重复数字的序列,used有去重作用)if(i>0 && nums[i]==nums[i-1] && used[i-1]==false) continue;
if(used[i]==true) continue;
C++代码:
class Solution {
public:
vector> result;
vector path;
void backtracking(vector& nums,vector& used) {
if(path.size() == nums.size()) {
result.push_back(path);
return;
}
for(int i=0;i0 && nums[i]==nums[i-1] && used[i-1]==false) continue;
if(used[i]==true) continue;
path.push_back(nums[i]);
used[i]=true;
backtracking(nums,used);
used[i]=false;
path.pop_back();
}
}
vector> permuteUnique(vector& nums) {
sort(nums.begin(),nums.end());
vector used(nums.size(),false);
backtracking(nums,used);
return result;
}
};
>>与前期文章的区别:
1.leetCode 77.组合问题 、leetCode 131.切割问题、leetCode 78.子集问题需要用startIndex,
2.本题
我的往期文章:
leetCode 46. 全排列 + 回溯算法 + 图解 + 笔记-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134753366?spm=1001.2014.3001.5501推荐和参考文章、视频:
代码随想录 (programmercarl.com)https://www.programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1R84y1i7Tm/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3