力扣算法刷题Day24|回溯:组合问题

力扣题目:#77.组合

刷题时长:30min

解题方法:回溯

复杂度分析

  • 时间O(n * 2^n)
  • 空间O(n):即递归使用栈空间的空间代价和临时数组的空间代价 O(n+k) = O(n)

问题总结

  • 初始化result和path的时候应分别定义,如result, path = [], [],而不能写成 result=path=[], 否则result会引用path跟着变动
  • 引用问题,result.append的内容应为path[:] 而不是 path

本题收获

  • append path和 path[:] 的区别:path是一个全局变量,指向唯一的原列表,直接引用path后内容会随path中的元素变化而改变。而path[:] 是重新对path进行了一份拷贝,不受path内容改变影响。

  • 回溯法思路:回溯法的搜索过程就是一个树型结构的遍历过程,for循环用来横向遍历,递归的过程是纵向遍历。

    • 递归返回值:无

    • 递归参数:n (数字的范围,即 1 到 n), k (组合zhong数字的个数), startIndex(记录下一层递归,搜索的起始位置,防止出现重复的组合)

    • 递归终止条件:path这个数组的大小如果达到k,即将path答案存入result

    • 单层递归搜索逻辑:for循环的i每次从startIndex开始遍历,然后用path保存取到的节点i

  • 剪枝优化:for循环的i,即组合起始位置,通过将i的终止范围定到 n - (k - len(path)) + 2 (从1开始的),可以剪掉后续遍历中组合长度不满足k的部分。

你可能感兴趣的:(算法)