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行,每次都从当前位置“向后”寻找,就不会重复了。
补充一个python的实现:
1 class Solution: 2 def backTrack(self,lists,index,k,n,temp,res): 3 if 0 == k: 4 res.append(temp[:]) 5 return 6 for i in range(index,n-k+2): 7 temp.append(i) 8 self.backTrack(lists,i+1,k-1,n,temp,res) 9 temp.pop(-1) 10 11 def combine(self, n: int, k: int) -> List[List[int]]: 12 lists = list(range(1,n+1)) 13 res = [] 14 self.backTrack(lists,1,k,n,[],res) 15 return res
注意加颜色的变量和判断条件,可以加速。