在做LeetCode39题的时候,作为算法小白没有啥思路,看课后讨论又有点看不懂,最后在CSDN看到一篇关于这道题的详解,看完之后发现博主贴的代码有各种语言版本,但每个版本没有详细分析,于是我想针对java版本做一个代码注释补充,希望和我一样的小白能够清晰的理解这道题,也有助于我以后复习。下面是博主的代码。
- public List<List<Integer>> combinationSum(int[] candidates, int target) {
- List<List<Integer>> res = new ArrayList<>();
- List<Integer> temp = new ArrayList<>();
- Arrays.sort(candidates);
- findSum(candidates, target, 0,0,temp, res);
- return res;
- }
- public void findSum(int[] candidates, int target, int sum, int level,List<Integer> temp, List<List<Integer>> res){
- if(sum == target) {
- res.add(new ArrayList<>(temp));
- return;
- } else if(sum > target) {
- return;
- } else {
- for(int i=level;i<candidates.length;i++) {
- temp.add(candidates[i]);
- findSum(candidates, target, sum+candidates[i], i, temp, res);
- temp.remove(temp.size()-1);
- }
- }
- }
第一第二种情况很容易理解,我想分析一下第三种情况,首先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###;