LLM 算法岗 | 字节面试常问的 leetcode 算法题汇总,附 leetcode 链接


根据小红书和牛客网的面经总结。【⭐】代表博主推测的高频题,【🎯】代表已知有身边人被问到的题,🎈 代表思路速记。



1 DP:

私心加一个背包问题,本站博客讲解(python3)

  1. 最长递增子序列 (LIS, LeetCode 300)【⭐】
    • 题目:300. 最长递增子序列,🎈 dp 很容易就写出来了,但是 o(nlogn) 的贪心 + 二分有点复杂的,暂时没看懂,(感觉我也很难从头想到… 果然还是得多刷题
  2. 编辑距离【⭐】
  3. Word Break (变种)【⭐】
  4. 最长公共子串【⭐】
    • 题目:1143. 最长公共子序列本站题解博客(python3),🎈 dp[i][j] 表示以 nums1 的第 i-1 个元素和 nums2 的第 j-1 个元素为结尾的公共子串的长度,考察 nums1[i-1] == nums2[j-1],dp[i-1][j],dp[i][j-1]。
    • 注:LeetCode 中没有直接名为“最长公共子串”的题目。通常指 1143(子序列)。如果是严格的“子串”(连续),对应题目为 718. 最长重复子数组本站题解博客(python3),🎈 dp[i][j] 表示以 nums1 的第 i-1 个元素和 nums2 的第 j-1 个元素为结尾的公共子数组的长度,仅考察 nums1[i-1] == nums2[j-1]。
  5. 2D 接雨水,接雨水 (LeetCode 42)【⭐】
    • 1D 题目:42. 接雨水本站题解博客(python3),🎈 维护双指针 left_max 和 right_max,分别表示当前位置左边和右边已遇到的最大高度,left_max = max(left_max, height[left]),right 同理。如果 left_max < right_max:说明左边是短板,left 位置的水位由 left_max 决定,water += left_max - height[left],left 指针右移。如果 left_max >= right_max,反之同理。
    • 2D 题目:407. 接雨水 II本站题解博客(python3),🎈 【①】将矩阵最外圈的所有单元格放入一个最小堆(Priority Queue)中,堆中存储 (高度,行坐标,列坐标),同时将这些单元格标记为 visited(已访问)。【②】从堆中弹出高度最小的单元格 (h, r, c)。这个 h 代表了当前包围内部区域的“最低围墙高度”,也就是木板的短板。【③】检查该单元格的上下左右四个邻居,如果邻居未访问过,且 neighbor_h < h,则邻居可以积水,water += h - neighbor_h,同时邻居以高度 h 进最小堆,因为这个位置被水填满后,其有效高度变成了 h。如果邻居的高度 neighbor_h >= h,说明这里不能积水,邻居以 neighbor_h 高度进堆。邻居标为已访问。
  6. 乘积最大子数组 (LeetCode 152)
  7. 买卖股票的最佳时机 (LeetCode 121/122/123/188)【⭐】【🎯】
  8. 零钱兑换 (LeetCode 322)【⭐】
    • 题目:322. 零钱兑换,🎈 dp[i] 代表凑到 i 这个值 需要的最少硬币个数。为了凑到 amount,for i in range(1, amount + 1): for coin in coins: if i - coin >= 0 and dp[i - coin] < max_value - 10: dp[i] = min(dp[i], dp[i - coin] + 1)。
  9. 二叉树最大路径和 (LeetCode 124)
  10. Leetcode-902. 最大为 N 的数字组合
    • 题目:902. 最大为 N 的数字组合本站题解博客(python3),🎈 直接枚举,假设 N 有 L 位,≤ L-1 位的数字随便组;考虑 L 位的数字,从小到大遍历(已经排好序的)digits 列表,如果第 i 位 N[i] > digit,则后面 L-i-1 位随便组;如果 N[i] < digit,则后面的 digit 只会更大,相当于 12xxx > 11234,所以统计结束了;如果 N[i] == digit,则考虑 i+1 位,继续统计;需要维护一下有没有可能用 digits 正好组成 N(是否没有 break),如果有的话,ans 再 += 1。
  11. 知道秘密的人数
  12. 鸡蛋掉落
  13. 三角形最小路径和
  14. 分割等和子集
  15. 最后一块石头的重量 II
  16. 打家劫舍 III
  17. 最长有效括号
  18. 丑数【🎯】
    • 题目:264. 丑数 II313. 超级丑数,🎈 我们去找第 n 个丑数,使用长度为 n 的 dp 数组,dp[i] 表示第 i 个丑数。在 dp 列表里维护 2 指针 3 指针 5 指针,最开始都初始化到 0 的位置。每次它们 ×2 ×3 ×5,值与已经在 dp 列表里的去重,并选最小的作为 dp[i+1]。
    • for i in range(2, n + 1):
          num2, num3, num5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5
          dp[i] = min(num2, num3, num5)
          if dp[i] == num2:  p2 += 1
          if dp[i] == num3:  p3 += 1  # 这里不是 elif,是 if,这样可以自然地去重
          if dp[i] == num5:  p5 += 1
      
    • 题目:1201. 丑数 III,🎈 这个的做法是二分,以下是大概思路,虽然我还没写过。给我们四个整数:n a b c(abc 不一定是质数),需要找出第 n 个丑数。这个问题被转化为,给定一个整数 n,问 [1, n] 区域内有多少丑数。丑数的个数是:X/a + X/b + X/c - X/MCM_a_b - X/MCM_a_c - X/MCM_b_c + X/MCM_a_b_c,其中 MCM_a_b 是 ab 的最小公倍数。

2 双指针 / 滑动窗口:

  1. 最长无重复子序列 / 子串 (LeetCode 3)【⭐】
  2. 三数之和 (LeetCode 15)【⭐】
  3. 两个升序序列的合并【⭐】
  4. Leetcode-30. 串联所有单词的子串
  5. 有效三角形的个数 (LeetCode 611)
  6. 最长回文子串 (LeetCode 5)【⭐】

3 二分查找:

  1. Leetcode-81. 搜索旋转排序数组 II,33 搜索旋转排序数组【⭐】
  2. 在排序数组中查找元素的第一个和最后一个位置 (LeetCode 34)
  3. 有序矩阵中第 K 小的元素 (LeetCode 378)【⭐】【🎯】
  4. 求浮点数 sqrt(牛顿法/二分)【⭐】
    • 题目:69. x 的平方根,🎈 二分轻松又简单,需要 n = (left + right + 1) // 2 。
  5. 数组中的第 K 个最大元素 (LeetCode 215)【⭐】

再放一个经典快排,python 意外的好写【🎯】:

def quick_sort(arr):
    if not arr:
        return arr
    length = len(arr)
    pivot = arr[length // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

if __name__ == '__main__':
    arr = [4, 5, 2, 1, 3]
    print(quick_sort(arr))

4 贪心算法:

  1. Leetcode-1221. 分割平衡字符串
  2. 合并区间 (LeetCode 56)【⭐】【🎯】
    • 题目:56. 合并区间,🎈 按区间开始端点(start)升序排列,这样,所有可能重叠的区间都会在数组中相邻。遍历时,若当前区间与 merged[-1] 重叠(curr_start <= last_end),则更新 merged[-1] 的 end = max(merged[-1] 的 end,当前区间 end)。
  3. 选择最少的数,使这些数的和大于 target
  4. 902. 最多为 N 的数字集合

5 DFS / BFS:

  1. 全排列 (LeetCode 46)
  2. 组合 (LeetCode 77)
  3. 岛屿数量【⭐】
    • 题目:200. 岛屿数量本站题解博客(python3),🎈 dfs bfs 都行,map[i][j] = 1 是岛,我们就设 map[i][j] = 0 用水给它淹掉,同时 cnt += 1。dfs 就对 ij 的所有邻居继续调 dfs,bfs 就维护一个队列,队首出队 邻居入队,直到没有 == 1 的邻居。
  4. 二叉树最近公共祖先 (带父指针)【⭐】
  5. 字符串解码 (LeetCode 394)
  6. Leetcode-902. 最大为 N 的数字组合
  7. Leetcode-103. 二叉树的锯齿形层序遍历
  8. Leetcode-2359. 找到离给定两个节点最近的节点
  9. 695. 岛屿的最大面积
    • 题目:695. 岛屿的最大面积,🎈 dfs bfs 都行,魔改一下那个岛屿数量,把 cnt += 1 变成记录一个面积。
  10. 301. 删除无效的括号

6 堆 / 优先队列:

  1. 合并 K 个升序链表 (LeetCode 23)
  2. 求字符串出现最多的字符及次数【⭐】
    • 说明:这是一道基础面试题,LeetCode 没有完全对应的原题。
    • 推荐练习:451. 根据字符出现频率排序本站题解博客(python3),🎈 题干:将一个字符串中的字符重新排列,出现次数越多的字符,越要排在前面。桶排序:我们创建一个数组(桶),数组的下标代表“频率”,例如 bucket[3] 存储所有出现 3 次的字符,o(n) 遍历一遍统计每个字符出现的频率。

7 栈:

  1. 有效的括号 (LeetCode 20)

8 链表:

  1. Leetcode-148. 排序链表
  2. Leetcode-面试题 02.05. 链表求和
  3. k 个一组翻转链表 (LeetCode 25)
  4. 删除链表的倒数第 N 个结点

9 其他:

  1. 有效数字 (LeetCode 65)
  2. Leetcode-470. 用 Rand7() 实现 Rand10()
  3. 525. 连续数组(前缀和 + 哈希表,将 0 视为 -1,求和为 0 的最长子数组;或参考 LC 560)


posted @ 2026-03-02 21:47  MoonOut  阅读(883)  评论(0)    收藏  举报