题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target
的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。 解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为: [ [7], [2,2,3] ]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]
解题思路
深度搜索每一种可能,递归查找(target -candidates[i])是否有解。
代码如下
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
if(target < 0) return null;
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(candidates);
dfs(res, candidates, new ArrayList<Integer>(), target, 0);
return res;
}
public void dfs(List<List<Integer>> res, int[] candidates, List<Integer> tmp, int target, int index) {
//如果target==0则找到
if(target == 0) {
res.add(tmp);
return;
}
//已经排序,所以如果target不为0且小于candidates[0]则return
if(target < candidates[0]) return ;
for(int i = index; i < candidates.length && candidates[i] <= target; i++) {
//如果candidates[0] > target则不用深度了
//index记录当前节点,之前的节点的结果已经被遍历了。
List<Integer> list = new ArrayList<>(tmp);
list.add(candidates[i]);
dfs(res, candidates, list, target-candidates[i], i);
}
}
}
提交结果
成功
显示详情
执行用时 : 6 ms, 在Combination Sum的Java提交中击败了98.24% 的用户
内存消耗 : 36.3 MB, 在Combination Sum的Java提交中击败了98.81% 的用户