最近在技术社区看到不少关于LeetCode刷题计划的讨论,其中"day110(3.11)——leetcode面试经典150"这个标题特别引起了我的注意。作为一个经历过多次技术面试的老兵,我深知系统化刷题对面试准备的重要性。这个标题背后反映的是一个持续110天的刷题计划,在3月11日这天聚焦于LeetCode经典150题——这正是大多数一线科技公司面试中最常考察的题目集合。
这套题目之所以被称为"经典150",是因为它基本涵盖了算法与数据结构的所有核心考点:从数组、字符串操作到树形结构遍历,从动态规划到图论算法。根据我的面试官经验,大约70%的面试算法题都能在这个题库中找到原型或变种。掌握这些题目不仅能够应对大多数技术面试,更能建立起扎实的算法思维基础。
根据我的刷题记录和面试反馈,经典150题大致可以分为以下几类:
数组与字符串操作(约35题)
链表操作(约15题)
树形结构(约25题)
动态规划(约30题)
图论算法(约20题)
其他杂项(约25题)
在day110这个节点,我建议采用"分类突破+模拟面试"的组合策略:
按知识点分类刷题:不要随机做题,而是按知识点集中攻克。比如今天专门解决动态规划类题目,明天专注树形结构问题。
计时模拟:每道题给自己设定合理时间限制(简单题15分钟,中等题25分钟,难题40分钟),模拟真实面试场景。
错题本机制:建立错题文档,记录每道错题的:
重要提示:不要满足于AC(Accepted),要追求最优解。面试中面试官往往会追问"能否优化"。
这道题是DP的典型代表,也是面试高频题。我遇到过至少5次这道题的不同变种。
标准解法:
python复制def lengthOfLIS(nums):
dp = [1] * len(nums)
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j]+1)
return max(dp)
时间复杂度O(n²)
优化解法(二分查找):
python复制import bisect
def lengthOfLIS(nums):
tails = []
for num in nums:
idx = bisect.bisect_left(tails, num)
if idx == len(tails):
tails.append(num)
else:
tails[idx] = num
return len(tails)
时间复杂度O(nlogn)
面试技巧:
这道题考察递归思维和树形结构理解,几乎出现在所有大厂的面试题库中。
递归解法:
python复制def lowestCommonAncestor(root, p, q):
if not root or root == p or root == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left if left else right
迭代解法(使用父指针):
python复制def lowestCommonAncestor(root, p, q):
stack = [root]
parent = {root: None}
while p not in parent or q not in parent:
node = stack.pop()
if node.left:
parent[node.left] = node
stack.append(node.left)
if node.right:
parent[node.right] = node
stack.append(node.right)
ancestors = set()
while p:
ancestors.add(p)
p = parent[p]
while q not in ancestors:
q = parent[q]
return q
常见面试问题:
经过大量刷题后,我发现很多题目都有固定解题模板。例如:
滑动窗口模板:
python复制def slidingWindow(s, t):
need = collections.Counter(t)
window = {}
left = right = 0
valid = 0
while right < len(s):
c = s[right]
right += 1
# 更新窗口数据
while window needs shrink:
d = s[left]
left += 1
# 更新窗口数据
return result
回溯法模板:
python复制def backtrack(path, choices):
if meet_condition:
results.append(path)
return
for choice in choices:
make_choice(choice)
backtrack(path, new_choices)
undo_choice(choice)
小数据测试法:先用极简测试用例验证基本逻辑
可视化调试:对于树/图问题,手动绘制执行过程
边界检查清单:
在真实面试中,我建议遵循以下流程:
面试官常会根据初始问题提出变种问题,例如:
可视化工具:
调试工具:
效率工具:
经典书籍:
在线课程:
题目分类精选:
刷题只是手段,不是目的。在完成经典150题后,建议:
记住,第110天不是终点,而是算法能力持续提升的新起点。保持每日至少1题的练习频率,定期复习错题本,将算法思维真正内化为自己的核心竞争力。