摘要:题目给定一个可能有重复数字的整数数组和一个目标数,找出中所有可以使数字和为的组合。中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。示例输入输出示例输入输出提示注意本题与主站题相同答案回溯法排序后去重
题目:
给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[ [1,1,6], [1,2,5], [1,7], [2,6]]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[ [1,2,2], [5]]
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
注意:本题与主站 40 题相同: https://leetcode-cn.com/problems/combination-sum-ii/
答案:
class Solution { List<List<Integer>> lists; public List<List<Integer>> combinationSum2(int[] candidates, int target) { //回溯法,排序后去重 Arrays.sort(candidates); lists = new ArrayList<>(); List<Integer> list = new ArrayList<>(); backTrace(list, candidates, target, 0); return lists; } public void backTrace(List<Integer> list, int[] candidates, int target, int index){ if(target == 0){ lists.add(new ArrayList<>(list)); return; } if(index >= candidates.length) return; if(target < 0 && candidates[index] > 0) return; for(int i = index; i < candidates.length; i++){ list.add(candidates[i]); backTrace(list, candidates, target - candidates[i], i + 1); while (i < candidates.length - 1 && candidates[i] == candidates[i + 1]) { i++; } list.remove(list.size() - 1); } }}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123185.html
摘要:遍历路径,找到所有可以到达终点节点的路径就是结果。提示中说保证输入为有向无环图,所以我们可以认为节点间一定有着某种排列的顺序,从头到尾怎样可以有最多的路径呢,那就是在保证没有环路的情况下,所有节点都尽可能多的连接着其他节点。 ...
阅读 1111·2021-11-19 09:40
阅读 969·2021-11-12 10:36
阅读 1259·2021-09-22 16:04
阅读 3105·2021-09-09 11:39
阅读 1266·2019-08-30 10:51
阅读 1882·2019-08-30 10:48
阅读 1221·2019-08-29 16:30
阅读 463·2019-08-29 12:37