代码随想录训练营 | 一刷总结

代码随想录一刷总结

文章目录

  • 代码随想录一刷总结
    • 数组
      • 数组理论基础
      • 二分法
      • 双指针法
      • 滑动窗口
    • 链表
      • 链表理论基础
      • 虚拟头节点
      • 链表的基本操作
      • 反转链表
      • 两两交换链表中的节点
      • 删除倒数第N个节点
      • 链表相交
      • 环形链表
    • 哈希表
      • 哈希表理论基础
      • 数组作为哈希表
      • Set作为哈希表
      • Map作为哈希表
    • 字符串
      • 双指针法
      • 反转系列
      • KMP
    • 栈与队列
      • 栈与队列理论基础
      • 栈的经典问题
        • 括号匹配问题
        • 字符串去重问题
        • 逆波兰表达式问题
      • 队列的经典问题
        • 滑动窗口最大值问题
        • 求前 K 个高频元素
    • 二叉树
      • 二叉树理论基础
      • 二叉树遍历方式
      • 二叉树的属性
      • 二叉树的修改与构造
      • 二叉搜索树的属性
      • 二叉树公共祖先问题
      • 二叉搜索树的修改与构造
    • 回溯算法
      • 回溯算法理论基础
      • 组合问题
        • 组合问题
        • 组合总和
        • 多个集合求组合
      • 切割问题
      • 复原IP地址
      • 子集问题
      • 递增子序列
      • 排列问题
    • 贪心算法
      • 贪心理论基础
      • 贪心简单题
      • 贪心中等题
      • 贪心解决股票问题
      • 两个维度权衡问题
      • 贪心解决区间问题
      • 其他难题
    • 动态规划
      • 动态规划基础
      • 背包问题
      • 打家劫舍
      • 买卖股票系列
      • 子序列系列
    • 单调栈
    • 结语:
    • 结语:


数组

数组篇5题

数组理论基础

二分法

循环不变量原则,坚持对区间的定义,确定好边界的范围

704. 二分查找

59. 螺旋矩阵 II

双指针法

通过一个快指针和慢指针在一个for循环下完成两个for循环的工作

27. 移除元素

977. 有序数组的平方

滑动窗口

滑动窗口也算是一种双指针

209. 长度最小的子数组


链表

链表篇7题

链表理论基础

虚拟头节点

有了虚拟头节点就对链表的增删操作统一了

203. 移除链表元素

链表的基本操作

也用到了虚拟头节点,方便增删改的操作

707. 设计链表

反转链表

递归法和迭代法(双指针)

206. 反转链表

两两交换链表中的节点

虚拟头节点

24. 两两交换链表中的节点

删除倒数第N个节点

虚拟头节点+快慢指针

19. 删除链表的倒数第 N 个结点

链表相交

双指针

面试题 02.07. 链表相交

环形链表

找环,但要设计一些数学证明

142. 环形链表 II


哈希表

哈希表8题

哈希表理论基础

什么时候用哈希表?给你一个元素判断在这个集合里是否出现过

一般来说哈希表都是用来快速判断一个元素是否出现集合里

数组作为哈希表

数组大小是受限的

242. 有效的字母异位词

383. 赎金信

Set作为哈希表

数组大小没有限制,避免浪费就用Set做映射了

349. 两个数组的交集

202. 快乐数

Map作为哈希表

map是一种<key, value>的结构,本题可以用key保存数值,用value在保存数值所在的下标。所以使用map最为合适

1. 两数之和

454. 四数相加 II

15. 三数之和

18. 四数之和


字符串

字符串7题

双指针法

字符串的题型常客

344. 反转字符串

剑指Offer 05.替换空格

反转系列

541. 反转字符串 II

151. 反转字符串中的单词

剑指Offer 58-II.左旋转字符串

KMP

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

8. 找出字符串中第一个匹配项的下标

459. 重复的子字符串


栈与队列

栈与队列7题

栈与队列理论基础

232. 用栈实现队列

225. 用队列实现栈

栈的经典问题

括号匹配问题

20. 有效的括号

字符串去重问题

1047. 删除字符串中的所有相邻重复项

逆波兰表达式问题

150. 逆波兰表达式求值

队列的经典问题

滑动窗口最大值问题

单调队列

239. 滑动窗口最大值

求前 K 个高频元素

优先级队列

347. 前 K 个高频元素


二叉树

二叉树31题

基本都是可递归可迭代

递归法三部曲:

  1. 递归函数的参数和返回值
  2. 终止条件
  3. 单层递归的逻辑

迭代法

二叉树理论基础

二叉树遍历方式

深度优先遍历:

三种排序都可以通过递归实现

前序后续可以通过递归、通过栈实现递归解决,但中序遍历用栈实现递归的话要做标记

144. 二叉树的前序遍历

145. 二叉树的后序遍历

94. 二叉树的中序遍历

广度优先遍历:

通过队列模拟

102. 二叉树的层序遍历

二叉树的属性

101. 对称二叉树

递归:后序,比较的是根节点的左子树与右子树是不是相互翻转

迭代:使用队列/栈将两个节点顺序放入容器中进行比较

104. 二叉树的最大深度

559. N 叉树的最大深度

递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度

迭代:层序遍历

111.二叉树的最小深度

递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义

迭代:层序遍历

222. 完全二叉树的节点个数

递归:后序,通过递归函数的返回值计算节点数量

迭代:层序遍历

110. 平衡二叉树

递归:后序,注意后序求高度和前序求深度,递归过程判断高度差

迭代:效率很低,不推荐

257. 二叉树的所有路径

递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径

迭代:一个栈模拟递归,一个栈来存放对应的遍历路径

404. 左叶子之和

递归:后序,必须三层约束条件,才能判断是否是左叶子。

迭代:直接模拟后序遍历

513. 找树左下角的值

递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。

迭代:层序遍历找最后一行最左边

112. 路径总和

113. 路径总和 II

递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。

迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与构造

226. 翻转二叉树

递归:前序,交换左右孩子

迭代:直接模拟前序遍历

106. 从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

递归:前序,重点在于找分割点,分左右区间构造

迭代:比较复杂,意义不大

654. 最大二叉树

递归:前序,分割点为数组最大值,分左右区间构造

迭代:比较复杂,意义不大

617. 合并二叉树

递归:前序,同时操作两个树的节点,注意合并的规则

迭代:使用队列,类似层序遍历

二叉搜索树的属性

700. 二叉搜索树中的搜索

递归:二叉搜索树的递归是有方向的

迭代:因为有方向,所以迭代法很简单

98. 验证二叉搜索树

递归:中序,相当于变成了判断一个序列是不是递增的

迭代:模拟中序,逻辑相同

530. 二叉搜索树的最小绝对差

递归:中序,双指针操作

迭代:模拟中序,逻辑相同

501. 二叉搜索树中的众数

递归:中序,清空结果集的技巧,遍历一遍便可求众数集合

538. 把二叉搜索树转换为累加树

递归:中序,双指针操作累加

迭代:模拟中序,逻辑相同

二叉树公共祖先问题

236. 二叉树的最近公共祖先

递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。

迭代:不适合模拟回溯

235. 二叉搜索树的最近公共祖先

递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先

迭代:按序遍历

二叉搜索树的修改与构造

701. 二叉搜索树中的插入操作

递归:顺序无所谓,通过递归函数返回值添加节点

迭代:按序遍历,需要记录插入父节点,这样才能做插入操作

450. 删除二叉搜索树中的节点

递归:前序,想清楚删除非叶子节点的情况

迭代:有序遍历,较复杂

669. 修剪二叉搜索树

递归:前序,通过递归函数返回值删除节点

迭代:有序遍历,较复杂

108. 将有序数组转换为二叉搜索树

递归:前序,数组中间节点分割

迭代:较复杂,通过三个队列来模拟

回溯算法

回溯算法12题

回溯三部曲:

  1. 回溯函数的参数和返回值
  2. 终止条件
  3. 单层搜索的逻辑

回溯算法理论基础

回溯是递归的副产品,只要有递归就会有回溯

回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下

所有回溯问题都可以抽象成树形结构

组合问题

组合问题

for循环横向遍历,递归纵向遍历,回溯不断调整结果集

剪枝精髓是:for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了

在for循环上做剪枝操作是回溯法剪枝的常见套路

77.组合

组合总和

组合总和(一)

已选元素总和如果已经大于n(题中要求的和)了,那么往后遍历就没有意义了,直接剪掉

216. 组合总和 III

组合总和(二)

如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex

17. 电话号码的字母组合

本题还需要startIndex来控制for循环的起始位置

39. 组合总和

组合总和(三)

集合元素会有重复,但要求解集不能包含重复的组合。“树枝去重”和“树层去重”

40. 组合总和 II

多个集合求组合

17. 电话号码的字母组合

切割问题

求解组合问题的思路来解决 切割问题本题就成功一大半了

但后续如何模拟切割线如何终止如何截取子串,其实都不好想,最后判断回文算是最简单的了

131. 分割回文串

复原IP地址

93. 复原 IP 地址

子集问题

子集问题(一)

在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果

78. 子集

子集问题(二)

多了去重

90. 子集 II

递增子序列

和子集很像

491. 递增子序列

排列问题

排列问题(一)

不同之处:

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

46. 全排列

排列问题(二)

去重,“树层去重”和“树枝去重”

47. 全排列 II


贪心算法

贪心算法16题

贪心理论基础

找出局部最优并可以推出全局最优

贪心简单题

455. 分发饼干

1005. K 次取反后最大化的数组和

860. 柠檬水找零

贪心中等题

376. 摆动序列

738. 单调递增的数字

贪心解决股票问题

122. 买卖股票的最佳时机 II

两个维度权衡问题

135. 分发糖果

406. 根据身高重建队列

贪心解决区间问题

55. 跳跃游戏

45. 跳跃游戏 II

452. 用最少数量的箭引爆气球

435. 无重叠区间

763. 划分字母区间

56. 合并区间

其他难题

53. 最大子数组和

134. 加油站


动态规划

动态规划38题

动态规划五部曲:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

动态规划基础

509. 斐波那契数

70. 爬楼梯

746. 使用最小花费爬楼梯

62. 不同路径

63. 不同路径 II

343. 整数拆分

96. 不同的二叉搜索树

背包问题

01背包理论基础

01背包理论基础(滚动数组)

416. 分割等和子集

1049. 最后一块石头的重量 II

494. 目标和

474. 一和零

完全背包理论基础

518. 零钱兑换 II

377. 组合总和 Ⅳ

70. 爬楼梯

322. 零钱兑换

279. 完全平方数

139. 单词拆分

多重背包理论基础

打家劫舍

198. 打家劫舍

213. 打家劫舍 II

337. 打家劫舍 III

买卖股票系列

121. 买卖股票的最佳时机

122. 买卖股票的最佳时机 II

123. 买卖股票的最佳时机 III

188. 买卖股票的最佳时机 IV

309. 买卖股票的最佳时机含冷冻期

714. 买卖股票的最佳时机含手续费

子序列系列

300. 最长递增子序列

674. 最长连续递增序列

718. 最长重复子数组

1143. 最长公共子序列

1035. 不相交的线

53. 最大子数组和

392. 判断子序列

115. 不同的子序列

583. 两个字符串的删除操作

72. 编辑距离

647. 回文子串

516. 最长回文子序列


单调栈

单调栈5题

739. 每日温度

496. 下一个更大元素 I

503. 下一个更大元素 II

42. 接雨水

84. 柱状图中最大的矩形

结语:

​ 一路走来,我是没想到自己真的坚持下来了哈哈哈,首先Carl哥讲的是真的好,很通透且清晰,从最开始的数组,到最后的单调栈,循序渐进,层层递进,一环扣一环,有些难题本来就不会做,没有前面的铺垫那就更加不会了,Carl哥用心了!

​ 其实自己也不好说完全掌握了这一路走来做的所有题,毕竟本来几乎没什么算法基础,总结完以后,以后估计都得二刷三刷什么的,算法就是这样,练得少就不行。

​ 数组的二分、双指针,链表的虚拟头节点、双指针,哈希表的数组、Set、Map,字符串的双指针、KMP,栈与队列的经典问题,二叉树的递归三部曲、遍历、属性、构造以及搜索树,回溯算法三部曲、组合、排列,贪心算法的局部推导全局,动态规划的五部曲,以及最后的单调栈收尾,这一切的学到的东西都让我收获满满,不少以前从来没听说过的,经过这60天的算法训练,让我一直不断提升,比前一天的自己更好,但不是说跟着Carl哥练完这60天,就变得无敌了,自己不努力改变,没人能替你成长。往后每天还是得不断坚持刷题,坚持巩固,也不祈求以后进个什么大厂,只要坚持以后,能达到我自己所能达到的级别即可。

problems/next-greater-element-ii/)

42. 接雨水

84. 柱状图中最大的矩形

结语:

​ 一路走来,我是没想到自己真的坚持下来了哈哈哈,首先Carl哥讲的是真的好,很通透且清晰,从最开始的数组,到最后的单调栈,循序渐进,层层递进,一环扣一环,有些难题本来就不会做,没有前面的铺垫那就更加不会了,Carl哥用心了!

​ 其实自己也不好说完全掌握了这一路走来做的所有题,毕竟本来几乎没什么算法基础,总结完以后,以后估计都得二刷三刷什么的,算法就是这样,练得少就不行。

​ 数组的二分、双指针,链表的虚拟头节点、双指针,哈希表的数组、Set、Map,字符串的双指针、KMP,栈与队列的经典问题,二叉树的递归三部曲、遍历、属性、构造以及搜索树,回溯算法三部曲、组合、排列,贪心算法的局部推导全局,动态规划的五部曲,以及最后的单调栈收尾,这一切的学到的东西都让我收获满满,不少以前从来没听说过的,经过这60天的算法训练,让我一直不断提升,比前一天的自己更好,但不是说跟着Carl哥练完这60天,就变得无敌了,自己不努力改变,没人能替你成长。往后每天还是得不断坚持刷题,坚持巩固,也不祈求以后进个什么大厂,只要坚持以后,能达到我自己所能达到的级别即可。

​ 看似不起波澜的日复一日,一定会在某一天,让你看到坚持的意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中的var究竟是强类型还是弱类型?

前言 在C#中&#xff0c;var关键字是用来声明变量类型的&#xff0c;它是C# 3.0推出的新特征&#xff0c;它允许编译器根据初始化表达式推断变量类型&#xff0c;有点跟javascript类似&#xff0c;而javascript中的var是弱类型。它让C#变量声明更加简洁&#xff0c;但也导致了…

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法&#xff08;二&#xff09; 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间&#xff1a; 子集树排列树 …

Promise.all如果其中之一失败,怎么能够拿到其他成功的结果

Promise.all 的基础介绍 作用&#xff1a;Promise.all()方法用于将多个 Promise 实例&#xff0c;包装成一个新的 Promise 实例。 参数&#xff1a;由多个Promise实例组成的数组 const p Promise.all([p1, p2, p3]);p的状态由p1、p2、p3决定&#xff0c;分成两种情况。 &a…

APP自动化之Poco框架

今天给大家介绍一款自动化测试框架Poco&#xff0c;其脚本写法非常简洁、高效&#xff0c;其元素定位器效率更快&#xff0c;其本质基于python的第三方库&#xff0c;调试起来也会非常方便&#xff0c;能够很好的提升自动化测试效率&#xff0c;节省时间。 (一&#xff09;背景…

如何实现数据通过表格批量导入数据库

文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 &#x1f389;如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&…

创建git仓库

①git init&#xff1a;用于在一个现有的目录中初始化一个新的 Git 仓库。 # 进入你的项目目录&#xff0c;如果你想要在当前目录下初始化 Git 仓库。 git init 这会在当前目录下创建一个名为 .git 的子目录&#xff0c;其中包含 Git 仓库的所有必要文件和目录。&#xff08;…

初学者必读书籍——两个月速成Python

想学Python的你是不是一直被它生涩难懂的劝退&#xff1f;作为一个自学入门的程序员&#xff0c;依靠这样几本书&#xff0c;两个月就学会了python。不卖关子&#xff0c;我学的就是”python编程三剑客“系列。那么接下来就让我给你介绍介绍吧。 1.《Python编程&#xff1a;从入…

OSG文字-osgText3D(5)

osgText3D 三维立体文字比二维平面文字显示效果更好&#xff0c;相对二维平面文字&#xff0c;它有非常好的立体显示效果。 在实际虚拟现实项目中&#xff0c;过多使用三维立体文字会降低染效率&#xff0c;加重渲染负担&#xff0c;相对平面二维文字&#xff0c;它占用的内存是…

MES系统管理范围及标准

一、计划管理 1.1计划分为:月度计划>周计划>日计划; 1.2MES系统一般都会直接精确到日计划(生产工单及生产指令); 1.3MES系统日计划分为三阶排产方式: 1.3.1日计划直接排到车间,由车间自行安排任务; 1.3.2日计划排到产线或设备,对应的班组长按照计划直接生产; 1.…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了&#xff0c;是一款现在非常主流的自动化测试工具&#xff0c;包括了web、api、APP&#xff0c;甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件&#xff0c;swagger是一个规范和完整的框架&a…

asterisk dialplan(extension)学习笔记

列举一些用过的dialplan&#xff0c;记录备忘 exten > 1004,1,Answer();第1步&#xff0c;监听到外部呼入1004这个号码&#xff0c;接听&#xff0c;对方就会看到电话已经接通 exten > 1004,n,Dial(SIP/1004,20,tr);第2步&#xff0c;通过SIP通道&#xff0c;拨打1004这…

Python通过selenium调用IE11浏览器报错解决方法

前提 正常安装Python 工具&#xff0c;selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象&#xff1a; 解决方法 打开浏览器进入 internet 选项 切换到安全页签 &#xff0c;去除“应用保护模式” 再次调用验证…

C语言——I /深入理解指针(一)

一、内存和地址 1byte&#xff08;字节&#xff09; 8bit&#xff08;比特位&#xff09; 1KB 1024byte 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB一个比特位可以存放二进制的0/1的一位 ⽣活中我们把⻔牌号也叫地址&#xff0c;在计算机中我们把内存单元的编号也称为…

真菌基因组研究高分策略(一):比较基因组揭示真菌菌丝和多细胞的起源

真菌是陆地和水生生态系统的重要组分&#xff0c;在有机质循环和跨营养级养分流通等过程中发挥着重要作用。随着测序技术的发展&#xff0c;高通量测序揭示了真菌群落巨大的系统发育和功能多样性&#xff0c;高质量真菌基因组的组装已经成为研究菌丝和潜在基因的进化起源的有力…

php利用ZipArchive类实现文件压缩与解压

github项目 1、Linux 安装 nginx 安装zlib库 cd /usr/local/src wget https://zlib.net/current/zlib.tar.gz tar -zxvf zlib.tar.gz cd zlib-1.3 ./configure make && make install 2、zlib的使用 $all_name all.zip;// 创建ZipArchive对象$zip_all new ZipArchi…

国外聊天IM — Sendbird

接⼝⽂档&#xff1a; https://sendbird.com/docs 好久没写文章了 我在官网找到的pom, 下载不下来&#xff0c;git下载下来&#xff0c;打进项目里不能用&#xff0c;就只能用简单的http了 直接上代码&#xff0c;只是简单的调通代码&#xff0c;根据你自己业务改&#xff1a;…

gensim库中word2vec的使用方式

gensim.models中的Word2Vec具体应用&#xff0c;里面的参数的含义以及一般取值 from gensim.models import Word2Vec# 示例文本 sentences [[this, is, a, sample, sentence],[another, example, sentence],[one, more, example]]# 训练 Word2Vec 模型 model Word2Vec(sente…

【c++】——类和对象(下) 万字解答疑惑

作者:chlorine 专栏:c专栏 目录 &#x1f6a9;再谈构造函数 &#x1f393;构造函数体赋值 &#x1f393;初始化列表 &#x1f6a9;explicit关键字 &#x1f6a9;static成员 &#x1f393;概念 面试题&#xff1a;计算创建多少个类对象 &#x1f393;特性 【问题】(非)…

智能合约安全漏洞与解决方案

// SPDX-License-Identifier: MIT pragma solidity ^0.7.0;import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol";/*智能合约安全在智能合约中安全问题是一个头等大事&#xff0c;因为智能合约不像其他语…

android.support.v4.view.ViewPager爆红

android.support.v4.view.ViewPager的地方改成androidx.viewpager.widget.ViewPager