(LeetCode39)Combination Sum

1 篇文章 0 订阅
1 篇文章 0 订阅

在做LeetCode39题的时候,作为算法小白没有啥思路,看课后讨论又有点看不懂,最后在CSDN看到一篇关于这道题的详解,看完之后发现博主贴的代码有各种语言版本,但每个版本没有详细分析,于是我想针对java版本做一个代码注释补充,希望和我一样的小白能够清晰的理解这道题,也有助于我以后复习。下面是博主的代码。

  1. public List<List<Integer>> combinationSum(int[] candidates, int target) {  
  2.     List<List<Integer>> res = new ArrayList<>();  
  3.     List<Integer> temp = new ArrayList<>();  
  4.     Arrays.sort(candidates);  
  5.     findSum(candidates, target, 0,0,temp, res);     
  6.     return res;  
  7. }  
  8. public void findSum(int[] candidates, int target, int sum, int level,List<Integer> temp, List<List<Integer>> res){  
  9.     if(sum == target) {  
  10.         res.add(new ArrayList<>(temp));  
  11.         return;  
  12.     } else if(sum > target) {  
  13.         return;  
  14.     } else {  
  15.         for(int i=level;i<candidates.length;i++) {  
  16.             temp.add(candidates[i]);  
  17.             findSum(candidates, target, sum+candidates[i], i, temp, res);  
  18.             temp.remove(temp.size()-1);  
  19.         }  
  20.     }  
  21. }  
可以看到,博主的方法是一个分治法求解,将大问题化解为了小问题的求解,即三种情况。1.如果找到一种情况,那就add进res并返回2.如果相加数大于目标,则返回3.如果sum小于目标,则继续递归循环。

第一第二种情况很容易理解,我想分析一下第三种情况,首先findsum函数中博主用了一个level参数,一开始我不明白什么意思,后来发现是为了配合for循环能够加相同的数,就比如题目要求得到7,我们可以2+2+3,加了两个2,如果没有level就不能加相同的数了。

我最后举一个题目例子吧。首先

1.0加了一个2,sum就为2,进入递归 

 2.sum变为4,继续递归

3.sum变为6,继续递归

4.sum变成8>7,return,sum变为6

5.进入for循环sum此时等于2+2+2+3=9>7,return,sum还是为6

6.继续for循环sum等于2+2+2+6>7

7.sum等于2+2+2+7>7

8.返回上一级递归,sum变为2+2,并继续for循环

9.sum变为2+2+3==7,放入res

10.sum变为2+2+6>7

以此类推。

第一次发博,有些地方可能讲的不是很清楚或者讲错了,希望大家指正。一起加油!

原博地址:http://blog.csdn.net/sbitswc/article/details/31659809###;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值