巧用递归解决LeetCode第39题(组合总和)

题目描述

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。

示例

示例1:

1
2
3
4
5
6
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]

示例2:

1
2
3
4
5
6
7
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]

题解

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
/**
* 利用递归求解
*/
private static List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
Arrays.sort(candidates);
find(result, temp, target, candidates, 0);

return result;
}

/**
* 从candidates[start]开始,寻找数组中的元素,使其加入已有组合temp后,和为target,并将这些新组合存入result
*/
private static void find(List<List<Integer>> result, List<Integer> temp, int target, int[] candidates, int start) {
if (target == 0) {
result.add(temp);
return;
}

for (int i = start; i < candidates.length && target >= candidates[i]; i++) {
//对temp进行深拷贝,这是为了不影响这一层其他的递归
List<Integer> list = new ArrayList<>(temp);
list.add(candidates[i]);
//进行递归
find(result, list, target-candidates[i], candidates, i);
}
}
-------------    本文到此结束  感谢您的阅读    -------------
0%