[LeetCode] #39 组合总和
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。
candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
输入: candidates = [2,3,5],
target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
要求我们找满足条件的组合,可以使用回溯算法
class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); helper(candidates, target, res, list, 0); return res; } public void helper(int[] candidates, int target, List<List<Integer>> res, List<Integer> list, int index){ if(index == candidates.length) return; if(target == 0){ res.add(new ArrayList<Integer>(list)); return; } helper(candidates, target, res, list, index + 1); if(target - candidates[index] >= 0){ list.add(candidates[index]); helper(candidates, target- candidates[index], res, list, index); list.remove(list.size() - 1); } } }
或者依赖排序进行循环
class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); Arrays.sort(candidates); helper(candidates, target, res, list, 0); return res; } private void helper(int[] candidates, int target, List<List<Integer>> res, List<Integer> list, int index) { if(target == 0) { res.add(new ArrayList<>(list)); return; } for(int i = index; i < candidates.length; i++) { if(target - candidates[i] >= 0) { list.add(candidates[i]); helper(candidates, target - candidates[i], res, list, i); list.remove(list.size()-1); } else { break; } } } }
知识点:无
总结:
走不通就退一步的枚举法就叫回朔法
寻找组合的问题可以使用回溯算法