标签:
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
For example, given candidate set 10,1,2,7,6,1,5
and target 8
,
A solution set is:
[1, 7]
[1, 2, 5]
[2, 6]
[1, 1, 6]
解题思路:
修改上题代码,将DFS宽度设置成2即可,注意使用Set,防止重复,JAVA实现如下:
public List<List<Integer>> combinationSum2(int[] candidates, int target) { Set<List<Integer>> list = new HashSet<List<Integer>>(); Arrays.sort(candidates); dfs(list, candidates, 0, target, 0); return new ArrayList<List<Integer>>(list); } static List<Integer> list2 = new ArrayList<Integer>(); static void dfs(Set<List<Integer>> list, int[] array, int result,int target, int depth) { if (result == target) { list.add(new ArrayList<Integer>(list2)); return; } else if (depth >= array.length || result > target) return; for (int i = 0; i <= 1; i++) { for (int j = 0; j < i; j++) list2.add(array[depth]); dfs(list, array, result + array[depth] * i, target, depth+1); for (int j = 0; j < i; j++) list2.remove(list2.size() - 1); } }
结果453 ms,效率略低,因此换掉Set,用一个变量计算每次DFS的宽度,JAVA实现如下:
public List<List<Integer>> combinationSum2(int[] candidates, int target) { ArrayList<List<Integer>> list = new ArrayList<List<Integer>>(); Arrays.sort(candidates); dfs(list, candidates, 0, target, 0); return list; } static List<Integer> list2 = new ArrayList<Integer>(); static void dfs(ArrayList<List<Integer>> list, int[] array, int result,int target, int depth) { if (result == target) { list.add(new ArrayList<Integer>(list2)); return; } else if (depth >= array.length || result > target) return; int step=1; while(depth<array.length-1&&array[depth]==array[depth+1]){ depth++; step++; } for (int i = 0; i <= step; i++) { for (int j = 0; j < i; j++) list2.add(array[depth]); dfs(list, array, result + array[depth] * i, target, depth+1); for (int j = 0; j < i; j++) list2.remove(list2.size() - 1); } }
Java for LeetCode 040 Combination Sum II
标签:
原文地址:http://www.cnblogs.com/tonyluis/p/4495545.html