LC 77 组合

33 阅读1分钟

题干

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

 

示例 1:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

思路

主要考察点:回溯算法

  • 递归函数的返回值以及参数:返回值通常为void,需要参数来标定位置,防止出现组合
  • 回溯终止的条件:当path的长度=k
  • 搜索过程:从标定位置遍历到n

解题 (未剪枝版本)

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    List<Integer> path = new ArrayList<Integer>();
    public List<List<Integer>> combine(int n, int k) {
        backtrace(n,k,1);
        return res;
    }
    void backtrace(int n,int k,int startIndex){
        if(path.size()==k){
            res.add(new ArrayList<Integer>(path));
            return;
        }
        for(int i = startIndex;i<=n;i++){
            path.add(i);
            backtrace(n,k,i+1);
            path.remove(path.size()-1);
        }
    }
}

解题(剪枝版本)

// 待续

最后总结一下回溯算法的模板

// 可以在主函数之外,作为类的全局变量
void backtrace(全局){
    if(终止条件){
      // 收集结果
      return;
    }
    for(集合元素){
      // 处理节点
      // 递归函数
      // 撤销操作
    }
    return;
}