0%

刷算法题-卷起来

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

待续