-
Notifications
You must be signed in to change notification settings - Fork 1
/
leetcode216.java
52 lines (46 loc) · 1.65 KB
/
leetcode216.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
*整体思路:在设定好i位置的值后,将i位置的值+1设为i+1位置的值,但remainder不变,
* 这样,在设置i+1位置的值时,i+1位置已经预设一个值,从这个值开始进行循环。
* 但当到达k-1位置的时候(也就是最后一个位置),直接将remainder(如果remainder合适)设置该位置的值。
*
*
*/
public class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(k==0 || n<2)
return list;
if((1+k)*k/2 > n)
return list;
List<Integer> subList = new ArrayList<Integer>();
int remainder = n;
subList.add(1);
helper(list,subList,0,k,remainder);
return list;
}
public void helper(List<List<Integer>> list,List<Integer> subList,int index, int k, int remainder){
if(index == k-1 && remainder > subList.get(k-2) && remainder <=9){ //如果可以组成一个结果。
subList.set(index,remainder); //修改指定位置数字
List<Integer> subList_1 = new ArrayList<Integer>();
for(int i=0;i<k;i++){
subList_1.add(subList.get(i));
}
list.add(subList_1);
return ;
}
else if(index<=k-2){
for(int i=subList.get(index);i<=9;i++){
subList.set(index, i);
remainder = remainder - i;
if(remainder <= i)
break;
else{
subList.add(index+1,i+1);
helper(list,subList,index+1,k,remainder);
subList.remove(index+1);
}
remainder = remainder + i;
}
}
}
}