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

    /*** [1,2,2,3] [] [1] [1,2] [1,2](重复) 情况: nums[1]=不选择,nums[2]=选择 [1,3] [1,2,2]* [1,2,3] [1,2,3](重复) 情况: nums[1]=不选择,nums[2]=选择 [1,2,2,3]* * @param nums* @return*/public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);List<List<Integer>> result = new ArrayList<List<Integer>>();List<Integer> list = new ArrayList<Integer>();dfs(result, list, nums, 0, false);return result;}private void dfs(List<List<Integer>> result, List<Integer> list, int[] nums, int idx, boolean selected) {if (idx == nums.length) {result.add(new ArrayList<Integer>(list));return;}if (idx > 0 && nums[idx - 1] == nums[idx] && !selected) {dfs(result, list, nums, idx + 1, false);} else {dfs(result, list, nums, idx + 1, false);list.add(nums[idx]);dfs(result, list, nums, idx + 1, true);list.remove(list.size() - 1);}}/*** 使用下标记录的方式,深度优先搜素思路* * @param nums* @return*/public List<List<Integer>> subsetsWithDupV2(int[] nums) {Arrays.sort(nums);List<List<Integer>> result = new ArrayList<List<Integer>>();boolean[] visit = new boolean[nums.length];// 记录是否选择dfsV2(result, visit, nums, 0);return result;}private void dfsV2(List<List<Integer>> result, boolean[] visit, int[] nums, int idx) {if (idx == nums.length) {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < visit.length; i++) {if (visit[i]) {list.add(nums[i]);}}result.add(list);return;}if (idx > 0 && nums[idx - 1] == nums[idx] && visit[idx - 1] == false) {dfsV2(result, visit, nums, idx + 1);} else {dfsV2(result, visit, nums, idx + 1);visit[idx] = true;dfsV2(result, visit, nums, idx + 1);visit[idx] = false;}}/*** 深度优先搜素思路:另一种不同的实现* 上面的思路是当我遍历到nums[i]的时候,我是不是选择这个元素;* 这个的思路是:第0个位置可以没有元素,或者选择的元素nums的0-(n-1);第二个位置可以没有元素,或者是从某个下标-(n-1)选择元素* * * @param nums* @return*/public List<List<Integer>> subsetsWithDupV3(int[] nums) {Arrays.sort(nums);List<List<Integer>> result = new ArrayList<List<Integer>>();List<Integer> each = new ArrayList<Integer>();dfsV3(nums, result, each, 0);return result;}private void dfsV3(int[] nums, List<List<Integer>> result, List<Integer> each, int startPos) {if (startPos <= nums.length) {result.add(new ArrayList<Integer>(each));}for (int i = startPos; i < nums.length; i++) {if (i > startPos && nums[i] == nums[i - 1])continue;each.add(nums[i]);// 选择i位置dfsV3(nums, result, each, i + 1);each.remove(each.size() - 1);}}

90 Subsets II相关推荐

  1. LeetCode 90. Subsets II

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

  2. 【暴力枚举】LeetCode 90. Subsets II

    LeetCode 90. Subsets II solution1和2均是利用set的,3和4是不利用set的 Solution1:我的答案 迭代法 class Solution { public:v ...

  3. 90. Subsets II

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

  4. 90. Subsets II 1

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

  5. [Leetcode]@python 90. Subsets II.py

    题目链接 https://leetcode.com/problems/subsets-ii/ 题目原文 Given a collection of integers that might contai ...

  6. 回溯模板+leetcode——78. 子集 + 90. 子集 II

    回溯法 一般情况下,看到题目要求「所有可能的结果」,而不是「结果的个数」,我们就知道需要暴力搜索所有的可行解了,可以用「回溯法」. 「回溯法」实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻 ...

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

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

  8. LeetCode 90.子集 II 中等难度

    90. 子集 II 题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例:输入: [1,2,2] 输出: [[2],[1],[ ...

  9. LeetCode 90. 子集 II【数组,回溯算法,排序去重】

    90. 子集 II 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.返回的解集中,子集可以按 任意顺序 排列. 示例 1: 输入 ...

最新文章

  1. Android Fragment 基本介绍
  2. 设计模式 — 行为型模式 — 模板方法模式
  3. 【LOJ】#3098. 「SNOI2019」纸牌
  4. 重力感应的测试程序andriod源代码
  5. 深度学习(二十七)可视化理解卷积神经网络-ECCV 2014
  6. 改进的简单Tooltips显示
  7. azure blob_使用Azure Blob存储托管Maven工件
  8. Linux 进程通信 -- 信号
  9. oracle 11gr2 asm安装,OEL6.1下oracle 11gr2 ASM安装
  10. perl 十六进制转二进制
  11. 关于手机号不能登录微信解决办法
  12. 详解vue原理之观察模式Dep->Watcher
  13. Solidity语言详解——view和pure函数的使用区别
  14. html做群聊通讯方法,微信如何发起群聊邀请(微信群链接生成教程)
  15. 0_13_QGIS纠正矢量数据
  16. 微信小程序 登录与退出登录
  17. 「镁客早报」苹果将在德国停售iPhone 7&8;“刘强东事件”正式结案...
  18. HTML+CSS实现一个淡显淡隐轮播图
  19. ssh 反向代理连接内网服务器并配置开机自启动(解决autossh无法开机自启动)
  20. ESP8266开发之旅 阿里云物联网平台篇④ LED智能灯控制系统(MQTTS客户端直连)

热门文章

  1. 7zip File: How to Uncompress 7z files on Ubuntu, Debian, Fedora
  2. 微软发布Visual Studio 2012 示例代码浏览器
  3. C# ASP.NET MVC 微信和支付宝H5支付开发及Demo
  4. python3下使用requests实现模拟用户登录 —— 基础篇(马蜂窝)
  5. 宝塔nginx运行vue项目刷新404问题解决
  6. Spark 连接 HBase 入库及查询操作
  7. html页面text固定长度,HTML中input type=text和type=password 显示的长度不一样
  8. mysql key value 引擎_mysql集成的key-value引擎-个人翻译
  9. Python四大金刚之三:元组
  10. (( 系统的自协调与抽象而成的自动反馈