乘风破浪:LeetCode真题_040_Combination Sum II

一、前言

这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可。

二、Combination Sum II

2.1 问题

2.2 分析与解决

通过分析我们可以知道使用递归就可以解决问题,并且这次我们从头遍历一次就不会出现多次使用某一个元素了。

class Solution {
List<List<Integer>> ans;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
ans = new ArrayList<>();
track(candidates, 0, target, new ArrayList<>());
return ans;
} private void track(int[] candidates, int index, int target, List<Integer> list) {
if (target == 0) {
ans.add(list);
return;
}
for (int i = index; i < candidates.length; i++) {
if (target < candidates[i] || (i > index && candidates[i] == candidates[i - 1]))//重要
continue;
List<Integer> temp = new ArrayList<>(list);
temp.add(candidates[i]);
track(candidates, i + 1, target - candidates[i], temp);
}
}
}

    如果这里没有(i > index && candidates[i] == candidates[i - 1])判断的话,就会造成重复的结果,究其原因是如果两个相同,之前的添加之后会进入到下一个递归里面运行了,而我们这个时候如果不过滤再次运行就会重复。

三、总结

    递归在我们的程序中用的非常多,一定要熟练深刻掌握。

乘风破浪:LeetCode真题_040_Combination Sum II的更多相关文章

  1. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  2. LeetCode算法题-Two Sum II - Input array is sorted

    这是悦乐书的第179次更新,第181篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第38题(顺位题号是167).给定已按升序排序的整数数组,找到两个数字,使它们相加到特定 ...

  3. 乘风破浪:LeetCode真题_018_4Sum

    乘风破浪:LeetCode真题_018_4Sum 一.前言 前面我们已经练习过了三个数相加的集合运算,现在变成了四个数,其实道理是一样的.三个数的时候可以转成两个数的加法,最后来解决,而四个数的可以转 ...

  4. 乘风破浪:LeetCode真题_016_3Sum Closest

    乘风破浪:LeetCode真题_016_3Sum Closest 一.前言      这一次,问题又升级了,寻找的是三个数之和最靠近的某个数,这是非常让人难以思考的,需要把三个数相加之后和最后给的目标 ...

  5. 乘风破浪:LeetCode真题_015_3Sum

    乘风破浪:LeetCode真题_015_3Sum 一.前言 关于集合的操作,也是编程最容易考试的问题,比如求集和中的3个元素使得它们的和为0,并且要求不重复出现,这样的问题该怎么样解决呢? 二.3Su ...

  6. 乘风破浪:LeetCode真题_013_Roman to Integer

    乘风破浪:LeetCode真题_013_Roman to Integer 一.前言 上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦 ...

  7. 乘风破浪:LeetCode真题_012_Integer to Roman

    乘风破浪:LeetCode真题_012_Integer to Roman 一.前言 经过了前面的思维训练,我们在某些方面有了一定的提高,但是对于实际的问题,要在短时间内得到答案,还是需要我们多多的练习 ...

  8. 乘风破浪:LeetCode真题_002_Add Two Numbers

    乘风破浪:LeetCode真题_002_Add Two Numbers 一.前言     这次的题目是关于链表方面的题目,把两个链表对应节点相加,还要保证进位,每个节点都必须是十进制的0~9.因此主要 ...

  9. 乘风破浪:LeetCode真题_001_TwoSum

    乘风破浪:LeetCode真题_001_TwoSum 一.前言 沉寂了很长时间,也悟出了很多的道理,写作是一种业余的爱好,是一种自己以后学习的工具,是对自己过往的经验积累的佐证,是检验自己理解深入度的 ...

随机推荐

  1. java中类的加载顺序介绍(ClassLoader)

    转自:http://blog.csdn.net/eff666/article/details/52203406 1.ClassNotFoundExcetpion  我们在开发中,经常可以遇见java. ...

  2. 使用clamav模块对数据流进行病毒检测

    准备工作:linux下安装clamav成功,启动clamav并打开本地socket监听"/tmp/clamav.socket" clamav开源工程目录:/usr/local/ 修 ...

  3. Android UI相关开源项目库汇总

    最近做了一个Android UI相关开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个st ...

  4. C语言Win32 Application 的标题栏图标,任务栏图标,exe文件图标问题

    我们这里新建的首先是一个空工程,新建c文件. 因为是空工程,我们没有资源文件,要用到图标资源,首先要新建和导入图标为资源. 选择引入资源,选择要引入的ico文件 完成,重命名保存Script_icon ...

  5. Net 使用UEditor笔记

    WebForm使用Ueditor获取编辑器的值有两种方法:1.通过前台js 获取 function test() { alert(UE.getEditor('控件Id').getContent()); ...

  6. sqlserver设计器实现约束

    一.约束类型简介 二.创建数据表 三.创建主键约束和非空约束 四.创建唯一约束 选中任一列,右键--索引/键 点击 添加 生成IX_Employees*, 类型设置为 “唯一键”, 然后选择要约束的列 ...

  7. Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query

    目录 引言 Match Phase Query slop 参数 analyzer 参数 zero terms query Match Phrase 前缀查询 max_expansions 小结 参考文 ...

  8. 如何在Eclipse中修改Git项目

    第一步:先在Eclipse创建一个要上传的项目. 第二步:创建一个Git仓库并与远程仓库相连 第三步:将Eclipse创建的项目复制到创建好的Git仓库 第四步:将Eclipse新建项目删除重新imp ...

  9. Java - HashCode源码解析

    Java提高篇(二六)-----hashCode hashCode的作用 要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用.在讲解数组时(java提高篇(十八)----- ...

  10. 【15】模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等.在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简 ...