首页 / 资讯中心 / 文章详情

算法刷题笔记:动态规划与优先队列实战解析

算法刷题笔记:动态规划与优先队列实战解析 ★ FEATURED ARTICLE
1. 刷题笔记的价值与意义作为一名程序员我坚持刷算法题已经三年多了。2026年1月22日这天的刷题笔记特别值得记录因为这天遇到的几道题目涵盖了多个经典算法模式。刷题不仅仅是应付面试的手段更是锻炼编程思维的有效方式。算法题就像健身房的器械训练每道题都在针对性地锻炼特定的思维肌肉。通过系统性地记录和整理刷题笔记可以清晰地看到自己的进步轨迹也能在遇到类似问题时快速回顾解题思路。2. 当日刷题题目概览2.1 题目选择策略我通常会按照1简单2中等1困难的比例来选择每日刷题组合。2026.1.22这天选择的题目是简单题两数之和经典热身题中等题二叉树的中序遍历递归与迭代实现中等题最长回文子串动态规划解法困难题合并K个升序链表优先队列应用提示建议每次刷题都包含不同难度这样既能保持信心又能持续挑战自己。2.2 刷题环境配置我的刷题环境配置如下IDEVS Code LeetCode插件语言Python 3.9兼顾简洁与效率辅助工具本地测试用例生成脚本笔记工具Markdown格式记录同步到GitHub# 本地测试用例示例 def test_two_sum(): nums [2,7,11,15] target 9 assert two_sum(nums, target) [0,1]3. 题目详解与解题思路3.1 两数之和的多种解法这道经典题目看似简单但蕴含着多种解题思路暴力枚举法双重循环时间复杂度O(n²)哈希表法空间换时间时间复杂度O(n)排序双指针法需要额外空间存储索引def two_sum(nums, target): hashmap {} for i, num in enumerate(nums): complement target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] i return []注意哈希表解法要注意处理重复元素的情况测试用例要考虑边界条件。3.2 二叉树中序遍历的迭代实现递归解法虽然简洁但理解迭代解法对掌握栈的应用很有帮助def inorder_traversal(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关键点使用栈模拟递归调用先一路向左到底处理节点后再转向右子树3.3 最长回文子串的动态规划解法这道题展示了动态规划的典型应用定义dp[i][j]表示s[i...j]是否为回文状态转移方程基本情况单个字符是回文两个相同字符是回文更长串首尾相同且中间是回文def longest_palindrome(s): n len(s) dp [[False]*n for _ in range(n)] res for l in range(n): for i in range(n-l): j i l if l 0: dp[i][j] True elif l 1: dp[i][j] (s[i] s[j]) else: dp[i][j] (s[i] s[j] and dp[i1][j-1]) if dp[i][j] and l1 len(res): res s[i:j1] return res3.4 合并K个升序链表的优先队列解法这道困难题展示了优先队列堆的典型应用场景import heapq def merge_k_lists(lists): dummy ListNode(0) curr dummy heap [] for i in range(len(lists)): if lists[i]: heapq.heappush(heap, (lists[i].val, i)) lists[i] lists[i].next while heap: val, i heapq.heappop(heap) curr.next ListNode(val) curr curr.next if lists[i]: heapq.heappush(heap, (lists[i].val, i)) lists[i] lists[i].next return dummy.next优化点使用元组存储值和链表索引每次只push一个节点保持堆的大小为O(k)时间复杂度O(Nlogk)N是总节点数4. 刷题技巧与经验分享4.1 高效刷题的方法论分类刷题法按算法类型集中练习如一周专攻动态规划五步解题法理解题意列举可能的解法选择最优解法编写代码测试与优化错题本机制记录错误原因和正确思路4.2 常见错误与调试技巧典型错误案例边界条件处理不当空输入、单个元素等循环终止条件错误指针/索引越界特殊数据结构使用不当调试技巧使用print语句输出中间变量绘制数据结构变化图编写测试用例覆盖边界条件使用调试器逐步执行4.3 刷题的时间管理我个人的时间分配建议15分钟理解题目和思考解法20分钟实现第一种解法15分钟优化和测试10分钟记录笔记和总结如果超过这个时间还没思路建议查看题解但一定要自己重新实现一遍。5. 刷题笔记的整理方法5.1 笔记内容结构每道题的笔记应包含题目描述用自己的话复述解题思路多种解法比较代码实现带注释复杂度分析相关题目链接5.2 知识图谱构建我使用思维导图工具将算法知识点连接起来例如动态规划 → 背包问题 → 子集和问题树 → 遍历方式 → 递归/迭代实现图 → DFS/BFS → 拓扑排序5.3 定期回顾机制我设置了以下回顾周期次日快速浏览前一天笔记周末总结本周刷题情况月末整理高频考点和薄弱环节6. 从刷题到面试的转化6.1 面试中的表达技巧在面试中讲解算法题时要注意先明确问题边界和假设讨论时间和空间复杂度权衡考虑可能的优化方向处理面试官的follow-up问题6.2 实际工程中的算法应用刷题中学到的算法在实际工作中的典型应用哈希表缓存实现、去重优先队列任务调度图算法社交网络分析字符串算法搜索引擎6.3 持续学习的资源推荐我常使用的进阶资源《算法导论》经典教材LeetCode讨论区优质题解算法可视化网站直观理解技术博客实战经验分享刷题三年多来最大的体会是算法能力的提升不是线性的而是阶梯式的。每次突破一个瓶颈期解决问题的能力就会上一个新台阶。2026.1.22这天的刷题笔记记录了我在动态规划和优先队列应用上的新理解也为后续的算法学习打下了更坚实的基础。
阅读完成 · 觉得有帮助?
咨询建站