在做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###;