题目描述 给定一个候选人编号的集合 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用 一次 。
注意: 解集不能包含重复的组合。
示例 1:
1 2 3 4 5 6 7 8 输入: candidates = [10 ,1 ,2 ,7 ,6 ,1 ,5 ], target = 8 , 输出: [ [1 ,1 ,6 ], [1 ,2 ,5 ], [1 ,7 ], [2 ,6 ] ]
示例 2:
1 2 3 4 5 6 输入: candidates = [2 ,5 ,2 ,1 ,2 ], target = 5 , 输出: [ [1 ,2 ,2 ], [5 ] ]
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
题目思路
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 class Solution { public List<List<Integer>> combinationSum2(int [] candidates, int target) { int len = candidates.length; List<List<Integer>> res = new ArrayList<>(); if (len == 0 ) { return res; } Arrays.sort(candidates); Deque<Integer> path = new ArrayDeque<>(len); dfs(candidates, len, 0 , target, path, res); return res; } private void dfs (int [] candidates, int len, int begin, int target, Deque<Integer> path, List<List<Integer>> res) { if (target == 0 ) { res.add(new ArrayList<>(path)); return ; } for (int i = begin; i < len; i++) { if (target - candidates[i] < 0 ) { break ; } if (i > begin && candidates[i] == candidates[i - 1 ]) { continue ; } path.addLast(candidates[i]); dfs(candidates, len, i + 1 , target - candidates[i], path, res); path.removeLast(); } } }