(LeetCode39)Combination Sum

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章