搜索、DP 与图高频

共 26 题
#

1. 岛屿数量中 DFS、BFS、并查集三种解法在递归深度与并发场景下的取舍?

A DFS 递归深度可达网格大小,大网格可能栈溢出 ✓ 正确答案
B 并查集无法用于岛屿数量
C BFS 比 DFS 更易栈溢出
D 三种解法空间复杂度完全不同
#

2. 最长递增子序列中 O(n²) DP 到 O(n log n) 贪心+二分的思路跃迁?

A 替换策略是"用更大的尾元素替换"
B tails 数组是递减的
C O(n²) DP 与 O(n log n) 复杂度相同
D O(n log n) 用 tails 数组存每种长度的最小尾元素,单调可二分 ✓ 正确答案
#

3. 课程表(拓扑排序)中 Kahn 算法与 DFS 染色法检测环的对比?

A DFS 染色法用双色标记
B Kahn 算法用入度归零的队列推进,出队数等于节点数则无环 ✓ 正确答案
C Kahn 算法无法检测环
D 染色法只能用于有向无环图
#

4. 网格类 BFS(最短路径、岛屿数量)与 Dijkstra 的转换条件是什么?

A Dijkstra 不能处理网格
B 边权不等时仍可用普通 BFS
C 0-1 BFS 用普通队列
D 边权全为 1 时 BFS 即求最短路,是 Dijkstra 的特例 ✓ 正确答案
#

5. 零钱兑换(LeetCode 322)中为什么是完全背包而非 0-1 背包,初始化 INF 与 dp[0]=0 的边界意义?

A 硬币只能用一次,是 0-1 背包
B 硬币可无限使用,是完全背包,一维 dp 正序更新 ✓ 正确答案
C dp[0] 应初始化为 INF
D 一维 dp 需倒序更新
#

6. 打家劫舍系列(线性/环形/树形)状态设计的演进关系?

A 树形问题用一维数组即可
B 环形问题拆成不含首与不含尾两个线性问题,取最大 ✓ 正确答案
C 线性转移为 dp[i]=max(dp[i-1], dp[i-2]+nums[i]),偷 i 则 i-1 也能偷
D 三题状态设计完全不同
#

7. 编辑距离 DP 的状态转移含义如何向面试官清晰解释?

A 边界 dp[0][j]=i
B 删除对应 dp[i][j-1]
C 相等时也要加 1
D 替换对应 dp[i-1][j-1],删除对应 dp[i-1][j],插入对应 dp[i][j-1] ✓ 正确答案
#

8. 求有向无环图的最长路径中拓扑排序 DP 与记忆化 DFS 的等价性?

A 两者复杂度不同
B 记忆化 DFS 无法避免重复计算
C 拓扑排序 DP 需要处理环
D 拓扑排序 DP 与记忆化 DFS 计算同一 DP,因为 DFS 后序在 DAG 上形成拓扑序 ✓ 正确答案
#

9. 0/1 背包与完全背包中一维滚动数组的遍历顺序为什么相反?

A 遍历顺序对结果无影响
B 两者都是正序
C 两者都是倒序
D 0/1 背包一维倒序,完全背包正序,区别在于是否允许重复使用同一物品 ✓ 正确答案
#

10. 动态规划的优化方向中滚动数组、状态压缩、单调队列与斜率优化何时用?

A 状态压缩用于转移含滑动窗口最值的场景
B 滚动数组利用只依赖相邻行的特性降低空间 ✓ 正确答案
C 单调队列用于子集状态
D 斜率优化用于降低空间
#

11. 爬楼梯(LeetCode 70)中为什么 f(n)=f(n-1)+f(n-2),与斐波那契的滚动数组优化?

A 空间复杂度为 O(n)
B 递推需要存整个数组,无法滚动
C f(n) 与斐波那契无关
D f(n)=f(n-1)+f(n-2),因为最后一步只能从 n-1 或 n-2 迈入 ✓ 正确答案
#

12. 买卖股票的最佳时机(LeetCode 121/122)中一次交易维护历史最低价,多次交易用贪心累加正差价的依据?

A 121 需要记录所有买卖点
B 121 维护历史最低价算单次最大利润;122 贪心累加所有正差价 ✓ 正确答案
C 122 的贪心只在能买一次时正确
D 两者都需要 O(n) 空间
#

13. 单词拆分与完全背包的映射关系?

A 单词是组合型完全背包,外层物品
B 单词可重复、顺序重要,是排列型完全背包,外层容量、内层物品 ✓ 正确答案
C 单词不可重复使用
D dp[i] 表示前 i 个单词能否拼出
#

14. 不同路径(LeetCode 62/63)中答案等于组合数 C(m+n-2, m-1),有障碍物时如何用 DP 处理?

A DP 无法处理边界障碍
B 有障碍时仍可用组合数
C 路径数 = C(m+n-2, n)
D 无障路径数 = C(m+n-2, m-1),有障碍时用 DP 使障碍格贡献 0 ✓ 正确答案
#

15. 边权为 0/1 的最短路中为什么 0-1 BFS 用双端队列能到 O(V+E),与普通 BFS、Dijkstra 的关系?

A 0-1 BFS 需要优先队列
B 0 权边入队尾
C 0 权边入队首、1 权边入队尾,用双端队列达到 O(V+E) ✓ 正确答案
D 0-1 BFS 与普通 BFS 完全相同
#

16. 并查集如何支持"按秩合并+路径压缩"的时间复杂度证明(反阿克曼函数)?

A 路径压缩 + 按秩合并使单次操作摊还到 O(α(n)) ✓ 正确答案
B 只压缩不按秩合并在任何情况下都 O(α(n))
C 按秩合并不影响树高
D 路径压缩是可选优化,不影响复杂度
#

17. 完全平方数(LeetCode 279)中为什么是完全背包问题,dp[n]=min(dp[n-k*k])+1 的转移?

A 复杂度为 O(n)
B 平方数只能用一次,是 0-1 背包
C dp[n] 只依赖 dp[n-1]
D 平方数可重复使用,是完全背包,转移 dp[n]=min(dp[n-k²])+1 ✓ 正确答案
#

18. 最大正方形(LeetCode 221)中 dp[i][j]=min(上,左,左上)+1 的状态含义,为什么取三者最小?

A dp[i][j] 取上、左、左上三者最小值 +1,因为任一方向不足都会限制边长 ✓ 正确答案
B 取三者最大值 +1
C 只依赖上方
D dp[i][j] 表示以 (i,j) 为左上角的正方形
#

19. 跳跃游戏(LeetCode 55/45)中维护最远可达下标判断可行性,最少步数如何用“当前边界+下一边界”贪心?

A 55 需要 BFS
B 45 需要枚举所有路径
C 55 维护最远可达下标判断可行性;45 用当前边界+下一边界贪心求最少步数 ✓ 正确答案
D 45 的贪心不保证最少步数
#

20. 最小路径和(LeetCode 64)中网格 DP 的边界初始化,与不同路径/最大正方形的统一视角?

A 与不同路径的转移完全相同
B 无需边界初始化
C 转移取上左最大值
D 首行首列需单独初始化(只能单向),中间取上左最小值 ✓ 正确答案
#

21. 分割等和子集(LeetCode 416)中如何把问题转化为 0-1 背包(目标和为总和一半),与零钱兑换的区别?

A 是完全背包,正序更新
B 转化为 0-1 背包(目标为总和一半),每个数只用一次,倒序更新 ✓ 正确答案
C 无需判断总和奇偶
D 与零钱兑换的背包类型相同
#

22. 记忆化搜索转 DP 的顺序推导中如何确定状态依赖方向(拓扑序)?

A 确定依赖方向后按"被依赖方先算"填表,通常按下标单调方向或拓扑序 ✓ 正确答案
B 转 DP 无需关心依赖顺序
C 记忆化搜索需要显式维护顺序
D 区间 DP 按大到小填表
#

23. 区间 DP 与状态压缩 DP 中典型问题与转移方程设计?

A 区间 DP 按区间长度递增填表,状态压缩 DP 用位掩码表示子集 ✓ 正确答案
B 区间 DP 用位掩码表示状态
C 状态压缩 DP 按长度递增
D 两者复杂度相同
#

24. 图的最短路径变体中带负权、多源、次短路与 A* 的适用场景?

A 多源必须跑多次单源
B Dijkstra 可处理负权
C 负权用 Bellman-Ford/SPFA,多源用虚拟源点,次短路用双值 Dijkstra ✓ 正确答案
D A* 无启发时比 Dijkstra 更慢
#

25. 状态压缩 DP 中旅行商问题的状压转移与位运算优化?

A 状态只需 mask 无需当前位置
B dp[mask][i] 表示已访问集合 mask 且当前在 i,转移枚举上一个城市 j ✓ 正确答案
C 复杂度为 O(n²)
D 位运算用于判断集合成员但无法移除元素
#

26. 矩阵中的最长递增路径(LeetCode 329)中记忆化 DFS 的状态复用,为什么能避免重复计算?

A 从 (i,j) 出发的最长路径与到达方式无关,可缓存复用,每个格子只算一次 ✓ 正确答案
B 记忆化会重复计算同一格子
C 严格递增无法保证无环
D 复杂度为 O(n²·m²)