news 2026/11/3 11:38:36

LeetCode Hot100算法精解:二叉树与动态规划实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode Hot100算法精解:二叉树与动态规划实战

1. Hot100算法题解析(71-80题)

作为一名在算法领域摸爬滚打多年的老码农,我深知LeetCode Hot100题库在面试准备中的重要性。这个系列收录了各大厂最高频的算法考题,今天我们就来深度拆解第71-80题,这些题目覆盖了二叉树、动态规划、回溯算法等核心考点。

2. 题目分类与核心考点

2.1 题目类型分布

这10道题中:

  • 二叉树相关:3题(包括遍历、路径和等问题)
  • 动态规划:4题(涉及字符串处理、股票买卖等经典模型)
  • 回溯算法:2题(排列组合问题)
  • 其他:1题(位运算)

2.2 重点题目解析

以第75题(颜色分类)为例,这是道经典的荷兰国旗问题。要求原地对包含红、白、蓝三种颜色的数组进行排序,时间复杂度必须控制在O(n)。

def sortColors(nums): p0 = curr = 0 p2 = len(nums) - 1 while curr <= p2: if nums[curr] == 0: nums[p0], nums[curr] = nums[curr], nums[p0] p0 += 1 curr += 1 elif nums[curr] == 2: nums[curr], nums[p2] = nums[p2], nums[curr] p2 -= 1 else: curr += 1

这个解法使用了三指针技巧:

  • p0指向0的最右边界
  • p2指向2的最左边界
  • curr用于遍历数组

注意边界条件:当curr与p2交换后,curr不能立即前进,因为交换过来的元素可能是0或1,需要再次判断

3. 动态规划专题精讲

3.1 股票买卖问题(第121题)

这是动态规划的经典案例,要求计算一次买卖的最大利润。关键在于找出历史最低点,然后在每个价格计算可能的最大利润。

def maxProfit(prices): min_price = float('inf') max_profit = 0 for price in prices: min_price = min(min_price, price) max_profit = max(max_profit, price - min_price) return max_profit

时间复杂度O(n),空间复杂度O(1)。这个解法展示了动态规划中"状态压缩"的技巧,将原本需要O(n)空间的DP数组优化为O(1)空间。

3.2 最大子序和(第53题)

Kadane算法的典型应用,要求找到具有最大和的连续子数组:

def maxSubArray(nums): curr_sum = max_sum = nums[0] for num in nums[1:]: curr_sum = max(num, curr_sum + num) max_sum = max(max_sum, curr_sum) return max_sum

这个算法背后的DP思想是:当前最大子序和要么是当前元素本身,要么是当前元素加上之前的最大子序和。

4. 二叉树高频考题

4.1 二叉树的中序遍历(第94题)

虽然题目简单,但要求使用迭代而非递归实现,考察对栈的理解:

def inorderTraversal(root): res = [] stack = [] curr = root while curr or stack: while curr: stack.append(curr) curr = curr.left curr = stack.pop() res.append(curr.val) curr = curr.right return res

这个解法模拟了递归的调用栈,时间复杂度O(n),空间复杂度O(n)。

4.2 路径总和III(第437题)

要求找出二叉树中路径和等于目标值的路径数量,路径不需要从根节点开始:

def pathSum(root, targetSum): from collections import defaultdict prefix = defaultdict(int) prefix[0] = 1 def dfs(node, curr): if not node: return 0 curr += node.val res = prefix[curr - targetSum] prefix[curr] += 1 res += dfs(node.left, curr) res += dfs(node.node.right, curr) prefix[curr] -= 1 return res return dfs(root, 0)

这个解法使用了前缀和+哈希表的技巧,将时间复杂度优化到O(n),是二叉树与哈希表结合的典型案例。

5. 回溯算法实战

5.1 全排列(第46题)

经典回溯问题,要求生成数组的所有可能排列:

def permute(nums): res = [] def backtrack(path, used): if len(path) == len(nums): res.append(path.copy()) return for i in range(len(nums)): if not used[i]: used[i] = True path.append(nums[i]) backtrack(path, used) path.pop() used[i] = False backtrack([], [False]*len(nums)) return res

回溯算法的三个关键点:

  1. 选择列表:当前可选的元素
  2. 路径:已经做出的选择
  3. 结束条件:达到决策树的底层

5.2 组合总和(第39题)

找出所有可以使数字和为目标数的组合,数字可以重复使用:

def combinationSum(candidates, target): res = [] def backtrack(start, path, target): if target == 0: res.append(path.copy()) return for i in range(start, len(candidates)): if candidates[i] > target: continue path.append(candidates[i]) backtrack(i, path, target - candidates[i]) path.pop() backtrack(0, [], target) return res

这个解法通过控制start参数避免生成重复组合,是回溯剪枝的典型应用。

6. 位运算妙用

6.1 只出现一次的数字(第136题)

要求找出数组中唯一不重复的元素,其他元素都出现两次:

def singleNumber(nums): res = 0 for num in nums: res ^= num return res

这个解法利用了异或运算的两个性质:

  1. a ^ a = 0
  2. a ^ 0 = a 因此所有成对出现的数字都会相互抵消,最后剩下的就是唯一数字。

7. 解题技巧总结

7.1 高频考点速查表

题型核心技巧相关题目
动态规划状态定义、转移方程、边界条件53, 62, 64, 70
二叉树递归/迭代遍历、路径问题94, 101, 104
回溯选择列表、路径记录、剪枝39, 46
双指针快慢指针、左右指针75
位运算异或特性、掩码操作136

7.2 面试准备建议

  1. 每个题型至少掌握3道经典题目
  2. 重点理解算法背后的思想而非死记硬背
  3. 白板编程时先理清思路再写代码
  4. 注意边界条件和特殊测试用例

在实际面试中,面试官更看重解题思路的清晰度和沟通能力。我建议在练习时养成边写代码边解释的习惯,这样在真实面试场景中会更加从容。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 11:38:36

Hot100算法题精解:动态规划与回溯法实战

1. 理解hot100算法题的本质 hot100算法题是程序员社区中广为流传的一个经典题目集合&#xff0c;它精选了100道高频出现的算法面试题。这个系列之所以被称为"hot"&#xff0c;是因为这些题目在各大科技公司的技术面试中出现概率极高&#xff0c;堪称算法准备路上的必…

作者头像 李华
网站建设 2026/11/3 11:38:19

MC9S12XS128指令集查询:嵌入式开发者的硬件级速查手册

简介&#xff1a;本资源是一份专为嵌入式开发初学者与智能车竞赛选手整理的MC9S12XS128微控制器指令集速查手册&#xff0c;聚焦飞思卡尔&#xff08;现NXP&#xff09;经典16位MCU的核心汇编指令&#xff0c;解决编程调试中指令功能不熟、助记符混淆、条件跳转逻辑不清等实际痛…

作者头像 李华
网站建设 2026/11/3 11:36:33

QJ71C24N 跑 MODBUS RTU:G.CPRTCL 实战避坑

简介&#xff1a;一份面向三菱Q系列PLC初学者与现场调试人员的MODBUS通信实例文档&#xff0c;围绕QJ71C24N串口模块展开&#xff0c;帮助读者理解模块配置、协议支持功能设置及G.CPRTCL指令的使用方法。压缩包内共1个doc文件&#xff0c;约854KB&#xff0c;以图文步骤、参数说…

作者头像 李华
网站建设 2026/11/3 11:36:17

MySQL二进制数据存储与读写优化实战

1. MySQL二进制数据读写实战指南 在数据库开发中&#xff0c;二进制数据的存储和读取是个高频需求场景。无论是存储图片、PDF文档&#xff0c;还是序列化对象&#xff0c;MySQL的BLOB类型字段都能完美胜任。但实际项目中&#xff0c;我发现很多开发者对二进制数据的处理存在误区…

作者头像 李华
网站建设 2026/11/3 11:35:35

Docker部署OpenClaw与飞书机器人集成实践

1. 为什么选择Docker部署OpenClaw&#xff1f; 在技术选型上&#xff0c;Docker容器化部署已经成为现代应用交付的黄金标准。我最近在团队内部推动OpenClaw与飞书的集成时&#xff0c;发现相比传统部署方式&#xff0c;Docker方案至少解决了三个痛点&#xff1a; 首先是环境依…

作者头像 李华
网站建设 2026/11/3 11:35:19

本机配置信息总结:结构化采集软硬件环境的实践指南

1. 项目概述&#xff1a;为什么一份“本机配置信息总结”比你想象中更重要 “本机配置信息总结”这七个字看起来平平无奇&#xff0c;像是一份随手记在备忘录里的技术笔记&#xff0c;甚至可能被当成运维新人的入门作业。但在我过去十年接触的数百个真实项目里——从某高校实验…

作者头像 李华