力扣算法刷题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的部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值