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:DFS(二叉遍历)算出路径,然后对比两个路径的分叉点;
- 思路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
待续