1. 题目

地址: https://leetcode.com/problems/subsets-ii/
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

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

2. DFS回溯解法

思路解析:

  1. 给数组排序
  2. 当列表的长度小于等于数组长度的时候,添加到结果列表
  3. 如果当前元素与上个元素相同,则忽略。
package backtracking;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;// https://leetcode.com/problems/subsets-ii/
public class SubsetsII {public static void main(String[] args) {int[] nums = {1,2,2};SubsetsII obj = new SubsetsII();List<List<Integer>> resultList = obj.subsetsWithDup(nums);System.out.println(Arrays.toString(resultList.toArray()));}public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);List<List<Integer>> resultList = new ArrayList<List<Integer>>();// dfsdfs(nums, resultList, new ArrayList<Integer>(), 0);return resultList;}private void dfs(int[] nums, List<List<Integer>> resultList, List<Integer> list, int start) {if (start <= nums.length) {resultList.add(list);}int i = start;while (i < nums.length) {list.add(nums[i]);dfs(nums, resultList, new ArrayList<Integer>(list), i + 1);list.remove(list.size() - 1);i++;while (i < nums.length && nums[i] == nums[i - 1]) {i++;}}}
}

3. 回溯解法用for循环

解题思路跟上面的一样,去重判断语句if (i > start && nums[i] == nums[i - 1]) continue; 在回溯算法里面比较通用,所以还是用这种方式同样可以解决。

public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);List<List<Integer>> resultList = new ArrayList<List<Integer>>();// dfsdfsWithFor(nums, resultList, new ArrayList<Integer>(), 0);//subsetsWithDupHelper(nums, resultList, new ArrayList<Integer>(), 0);return resultList;}private void dfsWithFor(int[] nums, List<List<Integer>> resultList, List<Integer> list, int start) {// exitif (start <= nums.length) {resultList.add(new ArrayList<>(list));}for (int i = start; i < nums.length; i++) {// duplicate caseif (i > start && nums[i] == nums[i - 1]) {continue;}// pick uplist.add(nums[i]);dfsWithFor(nums, resultList, list, i + 1);// not pick uplist.remove(list.size() - 1);}}

4. 顺序执行

解题思路:

  1. 对数组nums进行升序排序
  2. 挨个遍历数组nums的元素
  3. 如果当前元素与上个元素不相同,则从位置0开始对已有结果列表resultList进行遍历,把当前元素nums[i]都加入到子列表中。
  4. 如果当前元素与上个元素相同,则从上回的结果列表的大小开始,这样子可以过滤掉相同的元素。
public List<List<Integer>> subsetsWithDupIterate(int[] nums) {Arrays.sort(nums);List<List<Integer>> resultList = new ArrayList<List<Integer>>();List<Integer> list = new ArrayList<Integer>();resultList.add(list);int duplicateStart = 0;for (int i = 0; i < nums.length; i++) {int begin = 0;int size = resultList.size();if (i > 0 && nums[i] == nums[i - 1]) {begin = duplicateStart;}for (int k = begin; k < size; k++) {List<Integer> newList = new ArrayList<Integer>(resultList.get(k));newList.add(nums[i]);resultList.add(newList);}duplicateStart = size;}return resultList;
}

下载

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/SubsetsII.java

算法:回溯十三 Subsets II不重复的数组子集(3种解法)相关推荐

  1. 递归/回溯:Subsets II求子集(有重复元素)

    上一篇描述了针对数组中没有重复元素进行子集的求取过程递归/回溯:subsets求子集 但是当出现如下数组时: 例如: nums[] = [2, 1, 2, 2] 结果为: [[], [1], [1,2 ...

  2. 数字拆分问题算法回溯_回溯算法:求子集问题!

    给「代码随想录」一个星标吧! ❝ 认识本质之后,这就是一道模板题 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/le ...

  3. 高级数据结构与算法 | 回溯算法(Back Tracking Method)

    文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...

  4. 面试算法———回溯经典题目

    文章目录 分治模板 [50.Pow(x, n) ](https://leetcode-cn.com/problems/powx-n/) [169. 多数元素](https://leetcode-cn. ...

  5. 90. Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  6. 回溯java算法_聊聊算法——回溯算法

    "递归只应天上有,迭代还须在人间",从这句话我们可以看出递归的精妙,确实厉害,递归是将问题规模逐渐减小, 然后再反推回去,但本质上是从最小的规模开始,直到目标值,思想就是数学归纳法 ...

  7. 90. Subsets II 1

    题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  8. 算法 --- 回溯法

    回溯法 参考 - 剑指Offer 回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案. 回溯法解决的问题的特性: 可以形象地用树状结构表示: 节点: 算法中 ...

  9. 90 Subsets II

    90 Subsets II leetcode第90题,用深度优先搜索的思路写出了三种不同的代码.一道题目,同样是深度优先搜索的问题,因为看问题角度不同,思路不同,代码也不一样 /*** [1,2,2, ...

  10. LeetCode 90. Subsets II

    90. Subsets II Given a collection of integers that might contain duplicates, nums, return all possib ...

最新文章

  1. 2022-2028年中国白手套行业市场全景调查及发展前景分析报告
  2. centos查看cached内部文件
  3. 马斯克活猪脑机接口试验成功!多芯片植入,硬币大小,实时读取脑电波,已被批准人脑实验...
  4. jupyter Nodebook如何查看函数帮助
  5. 欧拉公式cos_谈谈欧拉公式与复指数信号
  6. ubuntu各版本代号(更新至15.04)及各版本下载地址等
  7. swagger内部类_spring boot 1.5.4 集成spring-Data-JPA(七)
  8. Delphi编程(二)__Delphi安装
  9. 19.敏捷项目管理流程实例 - 变更管理
  10. Java通过选择城市来计算运费(基础程序)
  11. 干掉Intel、AMD?国产处理器架构都有哪些?
  12. 读书笔记:汇编语言 第三版 王爽 清华出版社 前言 章一 章二 章三 章四 章五
  13. expect简介和使用例子
  14. MATLAB求解峰值、均值、平均幅值、方差、均方根、方根幅值、最值、峭度、斜度、裕度指标、波形指标、脉冲指标、峰值指标、峭度指标
  15. 标准正态分布面积(面积=比例=概率,不仅限于正态分布)
  16. SQS (Simple Queue Service)简介
  17. python高级编程函数_python高级编程1
  18. vb.net中栈、队列、数组、列表、链表的使用。
  19. JAVA爬虫(二):哔哩哔哩动画搞笑排行榜爬取
  20. 谷歌2012年I/O

热门文章

  1. JavaScript日期对象Date总结(附实例)
  2. AspNet WebApi OData 学习
  3. 【Python之旅】第四篇(一):Python装饰器
  4. 利用AsyncHttpClient实现图片的上传与下载
  5. 整理Oracle日期时间函数
  6. 运用incremental backup恢复归档GAP的DG-上篇
  7. 交换机的源地址学习机制和帧转发方式习题
  8. html点击文本框唤醒手机键盘,html移动应用 input 标签 清除按钮功能如何实现(不触发键盘)...
  9. java inflater_Android下LayoutInflater的正确使用姿势
  10. 7-4 谁会留下?规则如下:所有的学生绕成一圈,顺序排号,从第一个学生开始报数,凡是报到固定数字(例如 5)的都退出,直到只剩下一位学生游戏才中止。 (10 分)