面试-算法 Hot 100

LeetCode Hot 100 题目记录

LeetCode 热题 100

哈希

  • 1. 两数之和:使用字典保存出现过的数字及其坐标,判断 target - new_val 是否在集合里即可
  • 49. 字母异位词分组:将字符串排序,作为 key,将相同 key 的字符串存储成列表(主要就是排序后的字符串 ss 作为 key)
  • 128. 最长连续序列:将数组放到集合里,判别起始数字开始的最大长度(判断是否是起始数字可以看上一个数字在不在集合里)

双指针

  • 283. 移动零:使用 gap 统计 0 的个数,也就是向前覆盖的差值,最后将末尾赋值成 0 就可以了
  • 11. 盛最多水的容器:设置左右两个指针,向内收缩两边高度较小的一个,维护这个过程中的盛水容量最大值(原理:较小的指针不会再作为容器边界)
  • 15. 三数之和:坐标 i 维护最左侧数字位置,l 和 r 在右侧区间找和为 target 的两个数字,并跳过相同的数字
  • 42. 接雨水:维护单调减栈,如果出现单调增,计算形成的空区间(栈顶为底,弹出后的栈顶作为左位置,待 push 元素作为右位置)能够装的雨水量

滑动窗口

  • 3. 无重复字符的最长子串:维护字母统计窗口,使用双指针维护滑动窗口内不会出现重复的字符,记录双指针之间的最大距离
  • 438. 找到字符串中所有字母异位词:统计待匹配字符串的 p_counter,统计被匹配字符串 s 的 n 个值(滑动窗口初始化),依次移动 s 上的滑动窗口(维护滑动窗口),判断 s_counter 是否等于 p_counter 即可

字串

  • 560. 和为 K 的子数组:记录前缀和,两个前缀和相减等于 target,将前缀和保存成字典即可(需要记录指定前缀和的数量)
  • 239. 滑动窗口最大值
  • 76. 最小覆盖子串:对目标串建立字典,使用双指针,移动 r 的过程看是否满足字典匹配(check),如果匹配开始移动 l,记录 l 的最右位置,记录此时 l 与 r 之间的距离,并保存最小距离时的字串

普通数组

矩阵

  • 73. 矩阵置零:统计横向为 0 的 set 和 纵向为 0 的 set,遍历两个 set 分别设置对应行或者列为 0
  • 54. 螺旋矩阵:一共 n * n 个元素,设置四个轮转方向,遇到 flag 就转向(flag 可以设置为一个最小值 - 1)
  • 48. 旋转图像:四个值轮转(找四个特殊点计算关系)
  • 240. 搜索二维矩阵 II:类似于二分查找树,右上角作为根节点

链表

二叉树

  • 84. 柱状图中最大的矩形:单调增栈,确定每一个元素的左右边界(遇到减的元素,当前元素就是栈顶的右边界;加入元素前,栈顶元素就是当前元素的左边界)

多维动态规划

  • 139. 单词拆分:i 是字符串目标位置,j 是字符串切分起始位置,判断 j 处是否能切分,如果能切分,更新 i 位置能否切分
  • 140. 单词拆分 II:i 是字符串目标位置,j 是字符串切分起始位置,判断 j 处是否能切分,如果能切分,更新 i 位置的切分字符串,并更新 i 位置是否能切分(带记录的动态规划)