给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

之前的https://www.cnblogs.com/biat/p/10667051.html加个判断就行了

void backtracking(vector<int>& nums,int start,vector<int> &temp,vector<vector<int>> &ans) {

    if (!nums.size()) return;
if (start>=nums.size())
{
if(find(ans.begin(),ans.end(),temp)==ans.end())
ans.push_back(temp);
return;
}
for (int i=start; i<nums.size();i++)
{
swap(nums[i],nums[start]);
temp.push_back(nums[start]);
backtracking(nums, start+, temp,ans);// 递归求解
temp.pop_back();//回溯,不影响此次的循环
swap(nums[i], nums[start]);//回溯不影响此次的循环
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> curSeq;
backtracking(nums, , curSeq,ans);
return ans;
}

借鉴@宝宝可乖了一个方法:

  vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
perm(nums, , nums.size() - );
return ans;
} void perm(vector<int> nums, int left, int right) {
if (left == right)
ans.push_back(nums);
else {
for (int i = left; i <= right; i++) {
if (i != left && nums[left] == nums[i]) continue; # 去重
swap(nums[left], nums[i]);
perm(nums, left + , right);
}
}
}

“其实这个全排列算法就是固定一个数的位置(left),然后从下一位数再开始全排列(递归过程)...直到最后一位数,模拟手动全排列的过程。所以如果要去重的话,只要控制每次排列时,固定的那个数是不一样的就行了。因为固定的数不一样,那从这个数开始产生的全排列就不一样。所以只要让每次的left位置的数不一样就行,所以先sort,保证只有相邻的数是可能一样的,然后if (i != left && nums[left] == nums[i]) continue;使得每次固定的数(即left)都不一样,就行了。希望能解答你的疑问”

最新文章

  1. [spring源码学习]二、IOC源码——配置文件读取
  2. %----format 格式化字符串---- 生成器---- 迭代器
  3. iframe标签书写导致div不显示
  4. 运行mvc3.0项目所需dll
  5. c# random string
  6. 2016年江西理工大学C语言程序设计竞赛(初级组)
  7. Log4net使用指南
  8. IIS发布,图片和样式显示不了的问题
  9. mistral 工作流组件之二 思维导图
  10. Quartz的misfire特性
  11. LockSupport的park和unpark
  12. 迷宫城堡--HDOJ 1269(Tarjan)
  13. iOS: 学习笔记, 添加一个带界面约束的控制器
  14. 关于JQuery中$.data绑定数据原理或逻辑
  15. web打印小结
  16. python 密码学编程
  17. cnpm下载包与npm版本不一致的问题解决
  18. mysql5.6做单向主从复制Replication
  19. Ubuntu 开机自启动SSH+远程关机
  20. JS编程题练习

热门文章

  1. 50+ Useful Docker Tools
  2. ZooKeeper 典型应用场景
  3. 在Oracle/SQL Service中通过Function返回Table
  4. 第2课 android机器人的翻页相册
  5. npdp
  6. C#中的特殊数据类型
  7. Linux下部署redis以及相关简介
  8. SQL Server -&gt;&gt; ColumnStore Index(列存储索引)
  9. 一些baidu面经
  10. Android开发精彩博文收藏——UI界面类