1. 为什么算法面试总爱考动态规划和图遍历?
上周帮学弟复盘一场大厂技术面,面试官连续抛出三道题:爬楼梯问题、岛屿数量计算、最短路径优化。看似题型各异,实则都指向两个核心考点——动态规划(DP)和图遍历。这绝非偶然,根据我参与过的近百场技术面试统计,超过70%的中高阶算法题都与这两个知识点强相关。
动态规划之所以成为面试官的"心头好",在于它能同时考察候选人的三大能力:问题拆解(如何定义状态转移方程)、数学建模(边界条件与递推关系)、代码实现(空间优化技巧)。而图遍历则是现实业务场景的抽象常客,从社交网络的好友推荐到物流系统的路径规划,DFS/BFS的变体应用无处不在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划的系统性破解之道
2.1 识别DP问题的黄金特征
去年我在准备谷歌面试时,总结出DP题的三个判断信号:
- 问题可分解为重叠子问题(如斐波那契数列计算)
- 存在最优子结构性质(局部最优解能构成全局最优)
- 需要做选择性决策(如背包问题的装与不装)
典型反例是快速排序——虽然能分治但子问题不重叠,这类问题用分治法更合适。
2.2 五步标准化解题框架
通过LeetCode 300+题的实战验证,我提炼出这套通用解法流程:
-
定义状态表示(DP数组含义)
- 一维数组:通常用于线性序列问题(如最大子数组和)
- 二维数组:适合矩阵路径或双序列问题(编辑距离)
-
建立状态转移方程
- 正向递推:dp[i] = f(dp[i-1], dp[i-2])
- 逆向推导:从终点倒推初始状态
-
初始化基准条件
- 特别注意dp[0]和dp[1]的取值
- 处理负数索引等边界情况
-
确定遍历顺序
- 01背包问题:物品外层循环,容量内层倒序
- 完全背包:容量层正序遍历
-
空间复杂度优化
- 滚动数组技巧(将O(n²)降为O(n))
- 状态压缩(如位运算表示状态)
实战案例:LeetCode 72编辑距离
python复制def minDistance(word1, word2): m, n = len(word1), len(word2) dp = [[0]*(n+1) for _ in range(m+1)]
