本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

鉴于周末的总结篇阅读量都不高,大家周末应该在放松,很多录友都错过了周小结,所以我把周小结移到了周五,周末我会更新一些轻松点的内容。

周一

在回溯算法:求子集问题(二)中,开始针对子集问题进行去重。

本题就是回溯算法:求子集问题!的基础上加上了去重,去重我们在回溯算法:求组合总和(三)也讲过了。

所以本题对大家应该并不难。

树形结构如下:

周二

在回溯算法:递增子序列中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨!

树形结构如下:

回溯算法:递增子序列留言区大家有很多疑问,主要还是和回溯算法:求子集问题(二)混合在了一起。

详细在本周小结!(回溯算法系列三)续集中给出了介绍!

周三

我们已经分析了组合问题,分割问题,子集问题,那么回溯算法:排列问题! 又不一样了。

排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。

如图:

大家此时可以感受出排列问题的不同:

  • 每层都是从0开始搜索而不是startIndex
  • 需要used数组记录path里都放了哪些元素了

周四

排列问题也要去重了,在回溯算法:排列问题(二)中又一次强调了“树层去重”和“树枝去重”。

树形结构如下:

这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!

我就用输入: [1,1,1] 来举一个例子。

树层上去重(used[i - 1] == false),的树形结构如下:

树枝上去重(used[i - 1] == true)的树型结构如下:

可以清晰的看到使用(used[i - 1] == false),即树层去重,效率更高!

性能分析

之前并没有分析各个问题的时间复杂度和空间复杂度,这次来说一说。

这块网上的资料鱼龙混杂,一些所谓的经典面试书籍根本不讲回溯算法,算法书籍对这块也避而不谈,感觉就像是算法里模糊的边界。

所以这块就说一说我个人理解,对内容持开放态度,集思广益,欢迎大家来讨论!

子集问题分析:

  • 时间复杂度:O(n * 2n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2n),构造每一组子集都需要填进数组,又有需要O(n),最终时间复杂度:O(n * 2^n)
  • 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n)

排列问题分析:

  • 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * … 1 = n!。
  • 空间复杂度:O(n),和子集问题同理。

组合问题分析:

  • 时间复杂度:O(n * 2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。
  • 空间复杂度:O(n),和子集问题同理。

一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!

总结

本周我们对子集问题进行了去重,然后介绍了和子集问题非常像的递增子序列,如果还保持惯性思维,这道题就可以掉坑里。

接着介绍了排列问题!,以及对排列问题如何进行去重。

最后我补充了子集问题,排列问题和组合问题的性能分析,给大家提供了回溯算法复杂度的分析思路。

就酱,「代码随想录」一直都是干货满满,值得介绍给身边的朋友们!

我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在公众号:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

如果感觉对你有帮助,不要吝啬给一个

本周小结!(回溯算法系列三)相关推荐

  1. 八十四、Python | Leetcode回溯算法系列

    @Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  2. 【算法系列 三】 Quene

    为什么80%的码农都做不了架构师?>>>    1. 拓扑排序问题(HDU 1285) import java.io.BufferedReader; import java.io.I ...

  3. 经典算法系列三----堆排序

    花了些时间好好看了堆排序的内容,代码也敲了,现在来总结一下. 为了说明白点,有些图片我就从网上截取了. 首先是堆的概念. 数据结构中的堆,又叫二叉堆 一般用数组来表示堆得结构,或者说是把堆数组化.举个 ...

  4. 【python算法系列三】 希尔排序算法

    希尔排序,又叫"缩小增量排序",是对插入排序进行优化后产生的一种排序算法.它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增 ...

  5. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

  6. 「leetcode」最强回溯算法总结篇!历时21天、画了20张树形结构图、14道精选回溯题目精讲

    本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...

  7. 本题要求实现一个求整数的逆序数的简单函数。_回溯算法:求组合总和(二)...

    给「代码随想录」一个星标吧! ❝ 我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在 ...

  8. 从电影《蝴蝶效应》中学习回溯算法的核心思想

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 关注我们丨文末赠书 深度优先搜索算法利用的是回溯算法思想.这个算法思 ...

  9. 【算法系列 二】Stack

    为什么80%的码农都做不了架构师?>>>    栈应用的场景: 1.括号问题 2.后缀表达式 3.深度优先遍历 4.保存现场 1. 给定字符串,仅由"()[]{}" ...

  10. 极客时间——数据结构与算法(39) 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想

    转载地址:https://time.geekbang.org/column/article/74287 我们在第 31 节提到,深度优先搜索算法利用的是回溯算法思想.这个算法思想非常简单,但是应用却非 ...

最新文章

  1. ETL 工具下载全集 包括 Informatica Datastage Cognos( 持续更新)
  2. 算法与数据结构(面向对象思想)
  3. Android Camera的使用(一) 读书笔记
  4. 邮件发送---SpringBoot
  5. 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
  6. java笔记_2020年java程序员、java工程师必备资料(内含java学习思维图、视频教程、源码笔记等)...
  7. php毕业论文选题系统,基于THINKPHP的毕业论文选题系统的设计
  8. linux服务篇-Squid服务
  9. Elasticsearch——Keyword字段类型
  10. 如何选择剑桥英语KET,PET课程和老师
  11. 一个安全架构师需要做什么?有什么能力要求?
  12. 跟着官方文档一步一步搭建基于gozero的微服务
  13. 【路由篇】01. 修改密码 ❀ 1900 ❀ CISCO 路由器
  14. 物联网板开发入门指南
  15. Xray的安装与使用(超详细)
  16. js 切比雪夫多项式实现
  17. J2SE知识点回顾(上)
  18. 截图神器推荐 ShareX
  19. 关于iconfont symbol引入字体的方式
  20. Windows 查看系统信息及系统启动时间

热门文章

  1. Linux下七牛云存储qrsync命令行上传同步工具
  2. coursera 《现代操作系统》 -- 第八周 存储模型(2)
  3. 第四周 项目中的白盒测试
  4. maven install 读取jar包时出错;error in opening zip file
  5. 使用Win2D在UWP程序中2D绘图(二)
  6. c语言命名规则 [转载]
  7. Saiku2.6 配置数据源
  8. Linux中mongodb定时远程备份
  9. PHP魔术方法和魔术变量总结
  10. vs 2015 加载该页时出错。 解决方案