题目描述
给定一个候选人编号的集合 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
1 2 3 4 5 6 7 8
| 输入: candidates = , target = 8, 输出:
|
解题思路
- 回溯:元素可重复的不可重复选的组合问题。如果不进行第二段剪枝的话会超时
执行用时:4 ms, 在所有 Java 提交中击败了43.75%的用户
内存消耗:41.7 MB, 在所有 Java 提交中击败了65.39%的用户
通过测试用例:176 / 176
时间 O(N)
空间 O(N)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { List<List<Integer>> ans=new ArrayList<List<Integer>>(); List<Integer> list=new ArrayList(); public List<List<Integer>> combinationSum2(int[] candidates, int target) { Arrays.sort(candidates); backTrack(candidates,target,0,0); return ans; } public void backTrack(int []candidates,int target,int start,int sum){ if(sum==target){ ans.add(new ArrayList(list)); return ; } if(sum>target){ return; } for(int i=start;i<candidates.length;i++){ if(i>start&&candidates[i]==candidates[i-1])continue; list.add(candidates[i]); backTrack(candidates,target,i+1,sum+candidates[i]); list.remove(list.size()-1); } } }
|