回溯算法:递增子序列

周一

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

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

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

树形结构如下: 90.子集II

周二

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

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

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

周三

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

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

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

如图: 46.全排列 大家此时可以感受出排列问题的不同:

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

周四

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

树形结构如下: 47.全排列II1 这道题目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!

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

树层上去重(used[i - 1] == false),的树形结构如下: 47.全排列II2.png

树枝上去重(used[i - 1] == true)的树型结构如下: 47.全排列II3 可以清晰的看到使用(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),和子集问题同理。 一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!

总结

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

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

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

文章列表

更多推荐

更多
  • Pulsar消息队列-一套高可用实时消息系统实现 实时消息【即时通信】系统,有群聊和单聊两种方式,其形态异于消息队列:1 大量的 group 信息变动,群聊形式的即时通信系统在正常服务形态下,瞬时可能有大量用户登入登出。2 ...
  • Pulsar消息队列-Pulsar对比Kafka笔记 很多人查看 Pulsar 之前可能对 Kafka 很熟悉,参照上图可见二者内部结构的区别,Pulsar 和 Kafka 都是以 Topic 描述一个基本的数据集合,Topic 数据又分为若干 Partition,即对数据进行逻辑上的 ...
  • Pulsar消息队列-对 2017 年一套 IM 系统的反思 信系统的开发,前前后后参与或者主导了六七个 IM 系统的研发。上一次开发的 IM 系统的时间点还是 2018 年,关于该系统的详细描述见 [一套高可用实时消息系统实现][1] ...
  • Apache InLong编译-如何编译 下载源码,编译二进制文件,编译Docker镜像,下载源码load/main/)下载源码. 编译二进制文件mvn clean install -DskipTests,编译Docker镜像 mvn clean package -...
  • Apache InLong编译-入库 Hive 示例 安装 Hive,安装 InLong,新建接入,审批接入,配置 Agent 采集文件, 本节用一个简单的示例,帮助您快速体验 InLong 的完整流程。 安装 Hivee,这里推荐使用 Docker 进行快速安装,在开始之前,我们需要安装 ...
  • Apache InLong编译-使用 Pulsar 示例 安装 Pulsar,安装 Hive,安装 InLong,创建数据接入,数据接入审批,配置 Agent 采集文件,数据落地检查,问题排查,配置数据流 Group 信息,配置数据流,配置文件 Agent,配置数据格式,配置 Hive ...
  • Apache InLong文档-Sort 插件 总览,扩展 Extract Node,扩展 Load Node,集成 Extract 和 Load Node 到 InLong Sort 主流程,总览 InLong Sort 是一个基于 Apache Flink SQL 的 ETL ...
  • Apache InLong文档-Dashboard 插件 总览,集成新的 Load Node 到 InLong Dashboard 的主流程,总览 本文面向 InLong新增一个 Load Node,让插件开发变得简单。 InLong Dashboard 本身作为前端控制台,Inlong ...
  • Apache InLong文档-Manager 插件 总览,扩展读取节点,扩展写入节点,总览 -, **Apache Kafka** , **ClickHouse** 等, 详细内容可参考 [数据节点] 扩展读取节点 -
  • Apache InLong文档-Agent 插件 总览,概念和模型,流程图示,开发流程,接口,任务配置,Message,Reader,Sink,Source,总览 在 Standard Architecture 支持以插件的方式扩展新的采集类型,本文将指导开发者如何自定义新的 ...
  • 近期文章

    更多
    文章目录

      推荐作者

      更多