1.题目描述

Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.

Example 1:

Input: nums = [1,1,2]
Output:
[[1,1,2],[1,2,1],[2,1,1]]

Example 2:

Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Constraints:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

2.题解

这里用到了两个技巧:

(1)有重复数字,所以先排序,重复数字相邻更方便处理;

(2)用-100这个数组中不可能出现的数字来记录数字是否在路径中,用了O(1)的空间做记录;

要解决重复问题,我们只要设定一个规则,保证在填第 i 个数的时候重复数字只会被填入一次即可。而在本题解中,我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」,即如下的判断条件:

if (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1]) {continue;
}

这个判断条件保证了对于重复数的集合,一定是从左往右逐个填入的。

代码实现 - java版本:

class Solution {public List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> list = new ArrayList<>();//因为有重复,所以先排序Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums);return list;}private void backtrack(List<List<Integer>> list, List<Integer> tempList, int[] nums){if(tempList.size() == nums.length){list.add(new ArrayList<>(tempList));}else{for(int i = 0; i < nums.length; i++){//已经在tempList里了if(nums[i] == -100){continue;}//去重的关键:if(i > 0 && nums[i-1] != -100 && nums[i-1] == nums[i]){continue;}//做出选择tempList.add(nums[i]);//保存当前元素并隐藏int temp = nums[i];nums[i] = -100;//进入下一步决策树backtrack(list, tempList, nums);//还原nums[i] = temp;//撤销选择tempList.remove(tempList.size()-1);}}}
}

js版本:

/*** @param {number[]} nums* @return {number[][]}*/var permuteUnique = function(nums) {//有重复数字,所以先排序nums = nums.sort();const res = [];const path = [];permuteUniqueCore(nums, path, res);return res;};function permuteUniqueCore(nums, path, res){if(path.length === nums.length){res.push(path.slice());return;}for(let i = 0; i < nums.length; i++){//此时nums[i]已经在path里了if(nums[i] === -100){continue;}//去重if(i > 0 && nums[i-1] !== -100 && nums[i-1] === nums[i]){continue;}path.push(nums[i]);nums[i] = -100;permuteUniqueCore(nums, path, res);nums[i] = path.pop();}};

回溯专题——leetcode47. Permutations II medium(有重复数字的全排列)相关推荐

  1. 047 Permutations II 有重复数字的全排列

    给定一个可能包含重复数字的集合,返回所有可能的不同全排列. 例如, [1,1,2] 有以下不同全排列: [   [1,1,2],   [1,2,1],   [2,1,1] ] 详见:https://l ...

  2. Pythonic:递归、回溯等5种方法生成不重复数字整数

    问题描述:从0到9这10个数字任选3个不重复的数字,能构成哪些三位数? So easy!看到这样的问题,很多人会写出类似(注意,只是类似,我为了使得本文几个函数具有相同的调用形式,给demo1和dem ...

  3. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II

    题目: 删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A ...

  4. 九章算法面试题54 带重复元素的全排列

    九章算法官网-原文网址 http://www.jiuzhang.com/problem/54/ 题目 给定一个带重复元素的整数集合,求出这个集合中所有元素的全排列.对于集合[1,1,2],其本质不同的 ...

  5. E. Tyler and Strings(组合计数 + 树状数组/线段树)(带重复元素的全排列)

    题目链接 主要思路还是比较好想的,一些细节公式预处理比较难搞- 参考题解 分析 从前往后遍历,如果s[]剩下的数中,s[i] < t[i]则对答案是有贡献的: 贡献就是后面位置[i+1 ~ n] ...

  6. 回溯专题leetcode

    这期刷leetcode上所有的回溯专题 93. 复原IP地址 这题先不考虑一些剪枝类问题,只是单纯考虑AC,我们设置的两个参数,一个index表示索引到哪个字符串下标了,另一个strs双端队列放入表示 ...

  7. 【数字全排列】LeetCode 47. Permutations II

    LeetCode 47. Permutations II Solution1:我的答案 笨蛋方法:和第46题的思路差不多,把vector换成了set就OK啦~~~ class Solution { p ...

  8. [LeetCode] Permutations II 全排列之二

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  9. LeetCode:Permutations, Permutations II(求全排列)

    Permutations Given a collection of numbers, return all possible permutations. For example,  [1,2,3]  ...

最新文章

  1. ES6 WeakMap的实际用途是什么?
  2. cocos2dx 制作单机麻将(二)
  3. 深入理解Spark 2.1 Core (四):运算结果处理和容错的原理与源码分析
  4. 信息学奥赛一本通 1025:保留12位小数的浮点数 | OpenJudge NOI 1.1 05
  5. CSS 的三种样式 内联 内部 外部
  6. Redhat 设置cntlm代理步骤
  7. linux分区压力测试,stress-Linux系统压力测试工具使用及系统负载很高的几种场景测试...
  8. Robust line matching through line–point invariants
  9. IDEA配置好maven后新建maven项目一直build失败的解决方法
  10. 高德地图 web API 多点路线绘制
  11. 信息系统项目管理师论文范围管理范文(2021上半年范围管理论文)
  12. 支持Android 11安卓Flash播放器终极版源码方案2022(2:网页中嵌入)
  13. project2019安装教程
  14. 睡眠 应该用 a加权 c加权_困成狗?谈谈睡眠研究的遗传发现之旅
  15. python爬虫语句_Python爬虫练手之爬句子迷
  16. 系统激活成功仍显示水印,取消激活方法
  17. java常见的网络异常
  18. Unity升级2018与Google Android64位支持
  19. linux更换进程执行码,第八节 进程的切换和系统的一般执行过程—— 20135203齐岳...
  20. Nuxt - 网站接入 51LA 网站统计详细教程(提供 51LA.js 官方插件与引入教程)

热门文章

  1. 带内管理和带外管理的区别
  2. 条形码计算机工作原理视频,条形码的工作原理
  3. 京东用户购买意向预测(一)数据清洗
  4. vue项目添加水印,防止刷新页面水印消失
  5. 英国设计工作室Build平面设计作品欣赏
  6. setup,ref,reactive
  7. java cal_E:\JiSuanQijavac Cal.java Cal.java
  8. 卡西欧发布与红牛二队最新合作的高性能运动手表
  9. 离职总结(2020-9-15)
  10. pthread_create回调函数返回值