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

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

代码随想录一刷总结

数组

数组篇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天,就变得无敌了,自己不努力改变,没人能替你成长。往后每天还是得不断坚持刷题,坚持巩固,也不祈求以后进个什么大厂,只要坚持以后,能达到我自己所能达到的级别即可。

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

相关文章
|
5月前
|
机器学习/深度学习 程序员
老程序员分享:leetcode笔记201.BitwiseANDofNumbersRange
老程序员分享:leetcode笔记201.BitwiseANDofNumbersRange
26 0
|
6月前
|
人工智能 BI
牛客小白月赛66
牛客小白月赛66
40 0
下一篇
无影云桌面