组合总和II

题目描述:

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:
1.所有数字(包括目标数)都是正整数。
2.解集不能包含重复的组合。

题目链接

class Solution {private boolean[] used;private int[] candidates;private List<List<Integer>> result;private int target;private int len;public List<List<Integer>> combinationSum2(int[] candidates, int target) {// 回溯算法// 初始化this.len = candidates.length;this.used = new boolean[this.len];this.candidates = candidates;this.result = new ArrayList<List<Integer>>();this.target = target;Arrays.sort(this.candidates);// 去重核心一:一定要排序!DFS(0,0); // 第一个参数为当前的和,第二个参数为当前位置return this.result;}private void DFS(int sum,int begin){if(sum == this.target){List<Integer> temp = new ArrayList<Integer>();for(int i = 0 ; i<this.len ; i++){if(used[i]) temp.add(candidates[i]);}result.add(temp);return;}if(sum > this.target) return;for(int i = begin ; i<this.len ; i++){ // 遍历每个候选元素if(i>begin && candidates[i] == candidates[i-1]) continue; // 去重核心2:第一次遍历不会触发该条件,只有第二次及以上遍历才可能触发if(!used[i]){ // 1.判断第i+1个候选元素是否已经使用used[i] = true;DFS(sum+candidates[i],i+1); //  对下一个元素递归used[i] = false;}}}
}

典型的回溯算法,主要的难点为: candidates 中的每个数字在每个组合中只能使用一次,而组合里面的数字又可能重复。 所以我们事先需要对candidates数组进行排序处理,然后在for循环中添加去重的条件,即只要当前的candidates元素值等于上一个candidates元素值(i>begin下),那么都可以直接跳过当前的for循环,进入下一次for循环。读者可以试着纸上模拟,还是感觉有些难以理解的欢迎留言。

Leetcode 组合总和II相关推荐

  1. leetcode系列--40.组合总和 II

    leetcode系列–第40题.组合总和 II 给你一个由候选元素组成的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合 ...

  2. leetcode 39. 组合总和 40. 组合总和 II

    leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...

  3. ii 组合总和_40. 组合总和 II

    题目描述: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...

  4. Leetcode 组合总和 与 排列组合相关问题

    Leetcode 组合总和 与 全排列相关问题 组合总和 题目链接: Leetcode 39.组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 c ...

  5. 力扣:组合总和 II DFS剪枝

    组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合 ...

  6. 77.组合 | 40.组合总和II | 39.组合总和 | 784.字母大小写全排列

    77.组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合. 你可以按 任何顺序 返回答案. 示例 1: 输入:n = 4, k = 2 输出: [   [2,4], ...

  7. 005. 组合总和 II

    1.题目链接: 40. 组合总和 II 2.解题思路: 树层:同层遍历 树枝:递归遍历 2.1.题目要求: 给定一个数组 candidates 和一个目标数 target ,找出 candidates ...

  8. Suzy找到实习了吗 Day27 | 回溯进行中:39. 组合总和,40. 组合总和 II,131.分割回文串

    39. 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 , ...

  9. LeetCode 40. 组合总和 II(排列组合 回溯)

    1. 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...

最新文章

  1. 计算机网络实验课,【课堂】师生同上一节计算机网络实验课
  2. 3306端口_Spring Boot随机端口你都不会,怎么动态扩容?
  3. 10 大流行软件测试工具
  4. 求实数的绝对值。_例谈六种有关绝对值问题的解题方法
  5. python切换ip群发邮件_python获取外网IP并发邮件的实现方法
  6. saltstack 管理mysql_saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入...
  7. mysql中设置字符,MySQL 修改默认字符集
  8. TQ WP7 Starter
  9. vue+elementui+quill富文本框+秀米编辑器和135编辑器
  10. 计算机专业线性代数教学大纲,线性代数(专业必修课)教学大纲(2018版)
  11. 中国历史人物传记数据库 CBDB 若干表简介
  12. centos7 搭建最新的RAP2接口管理工具并导入原rap旧数据
  13. pdf文件去除无用内容和链接
  14. 不是家电品牌!不是家装品牌!不是家居品牌!三翼鸟是啥?
  15. python递归函数
  16. 计算机组成与系统结构2018,计算机组成原理与系统结构2018-2019试卷a.doc
  17. 上海高中计算机知识点总结,上海高中高考数学知识点总结(大全)
  18. 开源巨献:Google最热门60款开源项目(转)
  19. 时光荏苒,白驹过隙。2018年总结!
  20. 人脸识别(一)调用face++实现人脸检测

热门文章

  1. 运维工程师必备Linux常见安全策略与实践
  2. 程序员一直在找的日程安排工具
  3. 关于雷达信号“相干性”的解释
  4. 雅虎微博产品Meme开放API 开发智能手机版本(10月13日)
  5. 使用ONE(一个)API为博客添加每日一句话
  6. 网络偷窥者很多,如何消除上网的浏览痕迹?
  7. 在公司里如何写好一封电子邮件
  8. 参与IPFS项目最好的方式是买矿机挖Fil,而不是直接买币
  9. Google的gmail帐户
  10. SPL 工业智能:识别指定工况