看了一下别人写的,太复杂了。。
这道题难点在于去重,我也没有什么好办法,所以使用HashSet,记录每个list.tostring的值,进行去重
以下代码好于89%以上的答案
ArrayList<ArrayList<Integer>> result = new ArrayList<>(); HashSet<String> set = new HashSet<>(); public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) { Arrays.sort(num); cal(num, target, 0, new ArrayList<>()); return result; } private void cal(int[] num, int target, int current, ArrayList<Integer> list) { if (current < num.length && num[current] > target) return; for (int i = current; i < num.length; i++) { if (num[i] == target) { list.add(num[i]); if (!set.contains(list.toString())) { result.add(new ArrayList<>(list)); set.add(list.toString()); } return; } else if (num[i] < target) { list.add(num[i]); cal(num, target - num[i], i + 1, new ArrayList<>(list)); list.remove(list.size() - 1); } else { break; } } }