1 class Solution { 2 public List<List<Integer>> combine(int n, int k) { 3 List<List<Integer>> combinations = new ArrayList<>(); 4 List<Integer> combineList = new ArrayList<>(); 5 backtracking(combineList, combinations, 1, k, n); 6 return combinations; 7 } 8 9 private void backtracking(List<Integer> combineList, List<List<Integer>> combinations, int start, int k, final int n) { 10 if (k == 0) { 11 combinations.add(new ArrayList<>(combineList)); 12 return; 13 } 14 for (int i = start; i <= n - k + 1; i++) { // 剪枝 15 combineList.add(i); 16 backtracking(combineList, combinations, i + 1, k - 1, n); 17 combineList.remove(combineList.size() - 1); 18 } 19 } 20 }
这道题目是求组合,因此[1,2]与[2,1]算是重复的,只保留一种。
按照14行,每次都从当前位置“向后”寻找,就不会重复了。