刷算法题-卷起来

RT。

大环境不景气，为了生活，必须好好学习了 📚📖

一天一道算法题

1.【链表中倒数第 k 个节点】两个指针，a=0, b=k，一起向前移动，当 k 取值 = null 时，a=n-k。

【 二叉搜索树中第 K 小的元素】中序遍历，k--

【数组中的第 K 个最大元素】快速排序，不需要排序，只需要比较。

2.【全排列】递归 (DFS), 依次取数组元素，除去当前元素再分别递归取数组元素 (两 for 循环 + 递归)

3.【反转链表】一次循环 {prev=null,cur=0, next=temp}, 当 next = null 时，结束 while 循环

4.【二叉树的层序遍历】广度优先 BFS：while 同级遍历 (队列 shift) & 收集下一层节点 (push)

5.【螺旋矩阵】巧技：削苹果。削掉最外面一层 (shift 数组及其余数组 pop)，翻转整个数组 180 度 ([].reverse)，再削。

6.【复原 IP 地址】分割字符串，递归 (dfs), 检查每一段是否合法 0~255

7.【岛屿数量】每遇到陆地格子 = 1, 则 DFS 搜索，标记已搜索过的格子 (标记为 2)。

8.【N 叉树的层序遍历】BFS 广度优先遍历 root-->nextRoot []-->nextRoot []

9.【翻转二叉树】前、后序 DFS 深度遍历 or BFS 广度优先遍历，不能用中序 (会翻转两次)

10.【最长回文子串】https://writings.sh/post/algorithm-longest-palindromic-substring

11.【最长不含重复字符的子字符串】动态规划 + hashMap

12.【二叉树的最近公共祖先】思路 1(二叉遍历) 算出路径，然后对比两个路径的分叉点；

思路 2: 两个值都在左边，则最近 root 在左边；一左一右，则当前 root 就是最近公共祖先。

13.【旋转图像】两个 for，置换 matrix [j][n - 1- i] = matrix [i][j]

14.【无重复字符的最长子串】滑块 ->map 标识字符位置，max 标识当前最大位置

15.【合并两个有序数组】双指针，依次比较放入到一个新数组

16.【求根到叶子节点数字之和】dfs 算法，标记已访问过的子节点 (左 or 右)

17.【路径总和】dfs 算法，标记已访问过的子节点 (左 or 右)

18.【最大子序和】 单循环下，curSum <0 则舍弃 & 重新累加，curSum>maxSum && maxSum = curSum

19.【两数之和】建一个 map，放入 index 和 value，顺便比对下已放入的是否可以配对

【三数之和】2. 双指针法：排序数组 & 选定 [a,b,c] = [i,i+1,len-1],target=-num [i]

20.【数组中的第 K 个最大元素】快排法 (选择一个基准 p，小于 p 移到左边，大于 p 移到右边)，从 i=0 指针移动，如果当前指针 i=k，则 return

21.【长度最小的子数组】 滑块 ->map 标识字符位置

22.【字符串相加】转数组 & 反序 reverse，满 10 进 1

23.【二叉树的最大深度】前序遍历
24.【LRU 算法】new Map ()，map 是一个散列队列，set 总是到队列最后一个

一些资料

字节算法面试题：github.com/afatcoder/LeetcodeTop/blob/master/bytedance/frontend.md

leetcode Top： github.com/afatcoder/LeetcodeTop

看完这篇，你会理解图和树的遍历： https://zhuanlan.zhihu.com/p/98406357

二叉树遍历： github.com/liusaint/ls-blog/issues/25

待续