Skip to content

Latest commit

 

History

History
134 lines (71 loc) · 4.59 KB

File metadata and controls

134 lines (71 loc) · 4.59 KB

LeetCode 算法笔记

多维动态规划

62.不同路径

核心点:边界条件的初始化

因为第一行和第一列只能一直由一个方向走来,所以可以借此来初始化边界条件

64.最小路径和

本题已经给定了我们二维矩阵,我们转化一下思路来利用原矩阵的值重新进行一次初始化就行了

5.最长字符串(难)

法1:中心扩散法

法2:dp

法3:马拉车算法

二叉树

94.二叉树的中序遍历

创建一个数组res;利用递归算法来实现中序遍历

104.二叉树的最大深度

法 1:直接用 LC 里自带的算法来完成,max(int depth, int depth1)

法 2:层序遍历,使用队列来辅助完成任务

可以理解成开火车,不断处理每一层的节点

Key point:

  1. 每层的节点数
  2. 出队入队
  3. 新开一层就是有新的深度

226.翻转二叉树

Tip:左右子树互换;

法 1:用 DFS 的思想,直接深度遍历利用递归来解决;

法 2:BFS,创建队列,不断的

Key point:

DFS-用栈,从上往下递归的进行思考; BFS-用队列,一层一层的去思考;

101.对称二叉树

直接从题目所给的二叉树的结构出发;

543.二叉树的直接

思路:用 DFS递归思想不断往深处递归检查计算

深度:从左节点或右节点能提供的最大深度来进行思考

102.二叉树的层序遍历

Key point:用 size 来保存当前层的节点个数!

currentLevelSize

98.验证二叉搜索树

我本来的方法是利用二叉搜索树的中序遍历是升1序来解决问题,但是我开多了一个数组;

Key point:可以在中序遍历的时候开一个 pre 前置变量来辅助比较大小!!

比大小时的关键技巧:

当想要减小空间复杂度时可以考虑创建一个变量直接在递归的过程中比较

特殊数: long long prev = -2147483649LL; // 初始化为一个比 int 最小值还小的数

这个数开的也很重要

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

仍然是使用递归算法,依次构造左边和右边;不断的往深层跑!

230.二叉搜索树汇总第 k 小的元素

Key point:在二叉树一系列的递归算法中最关键的是对根节点的处理,它可以有不同种处理手段和思路,只要根据不同的情况使用不同的方法就行了!

199.二叉树的右视图

法一:层序遍历,key point:使用 currentsize 来记录当前层的节点数来帮我们找到最右侧节点

因为题目给出构造二叉树的序列是层序遍历的序列,所以我们可以从层序遍历出发去思考,

114.二叉树展开为链表

法一:使用先序遍历,开一个数组来存储先序遍历的序列,再在数组中遍历树节点来修改指针;这种方法的空间复杂度为 O(n),属实是有点高了,接下来我们采取方法 2 来降低我们的空间复杂度

法二:既然是修改树中节点指针的指向,又因为我们在法一中使用了先序遍历来将树节点存储在数组中,我们不妨思考一下是否能利用一个 pre 前置节点来帮助我们记录并节省空间(这种前置节点 pre 的思路在树的算法题中很常见!)

Tip:使用 pre 时是原地操作,时间复杂度为 O(1)

105.从前序与中序遍历序列构造二叉树(还不太会)

这道题的数组及变量的使用有点绕,还没理清楚

Tip:分治法

哈希表:用于快速定位二叉树

437.路径总结

Targetsum

选一条路径,该路径上节点值之和为 targetsum,也即是每层选一个节点(自顶向下)

思路:前缀和+哈希表

因为所求路径为自顶向上,不一定要从根节点开始或在叶子节点结束,所以我们考虑使用前缀和和利用哈希表来查值,这样可以显著降低我们的时间复杂度

BFS 与 DFS 的对比

维度 递归法 (DFS / max 函数) 层序遍历 (BFS)
代码简洁度 极简。几行代码搞定,逻辑优雅。 相对复杂。需要手动维护队列和循环。
系统稳定性 有风险。如果树极其深(几万层),会导致栈溢出 (Stack Overflow)。 稳健。数据存在堆区(Queue),通常内存很大,不容易崩溃。
直观性 抽象。需要理解递归的“回溯”过程。 直观。就像剥洋葱,一层一层非常清晰。
扩展性 适合处理路径、高度、子树相关问题。 适合寻找最短路径或按层处理。

Tip:在实际业务的海量数据中对深度未知的情况进行递归是非常危险的!所以我们一般改用 BFS