
1. 项目背景与核心价值作为一名算法工程师我坚持每天记录自己的刷题过程已经超过三年。这份2026-03-10~12 hetao1733837的刷题记录是我日常训练的一个典型切片记录了连续三天内解决的算法问题及其思考过程。不同于普通的刷题列表这份记录包含了题目分析、多种解法的比较、优化思路以及实际编码中的调试心得。在技术面试越来越注重实际解决问题能力的今天系统性的刷题训练已成为程序员职业发展的必经之路。但很多人在刷题过程中容易陷入只求ACAccepted的误区忽视了思维过程和优化方法的记录。这正是我坚持详细记录的价值所在——它不仅帮助我巩固知识点更形成了可追溯的技术成长轨迹。2. 刷题方法论与记录体系2.1 题目选择策略我采用分层递进的选题方式每日1道困难题如LeetCode Hard2-3道中等题侧重不同算法类型1道之前做错或未完全理解的复习题这种组合既能保持挑战性又能巩固基础。以3月10日为例新题LC 218 天际线问题扫描线算法复习题LC 76 最小覆盖子串滑动窗口优化2.2 记录模板设计每道题的记录包含以下核心字段## [日期] [题号] 题目名称 **标签**算法分类如DFS、DP **初始思路**第一直觉解法 **复杂度分析**时间/空间复杂度估算 **优化过程**逐步改进的思路 **最终代码**带注释的实现 **总结**关键收获与待改进点例如3月11日记录的LC 239滑动窗口最大值问题# 单调队列解法 from collections import deque class Solution: def maxSlidingWindow(self, nums: List[int], k: int) - List[int]: q deque() # 存储下标而非值 res [] for i, num in enumerate(nums): while q and nums[q[-1]] num: # 维护单调递减 q.pop() q.append(i) if q[0] i - k: # 移除越界元素 q.popleft() if i k - 1: res.append(nums[q[0]]) return res2.3 知识图谱构建我会用Notion建立算法知识图谱将题目与以下维度关联算法类型动态规划、图论等企业真题频率根据面经统计个人掌握程度1-5星评分相似题目关联如背包问题的变种这种结构化记录使得复习时可以按知识模块进行针对性训练而非随机刷题。3. 典型题目深度解析3.1 天际线问题LC 218问题描述 给定建筑物的起止坐标和高度输出城市天际线的关键点坐标。解法演进暴力解法O(n^2)遍历所有x坐标计算每个位置的最大高度扫描线优化O(nlogn)将建筑物拆解为左右边界事件点使用最大堆维护当前高度关键点出现在当前最大高度变化时代码实现要点import heapq def getSkyline(buildings): events [] for L, R, H in buildings: events.append((L, -H, R)) # 用负高度区分左右 events.append((R, 0, 0)) # 右边界 events.sort() res [] heap [(0, float(inf))] # (高度, 右边界) for x, negH, R in events: while heap[0][1] x: # 弹出过期的建筑物 heapq.heappop(heap) if negH: heapq.heappush(heap, (negH, R)) if not res or res[-1][1] ! -heap[0][0]: res.append([x, -heap[0][0]]) return res调试心得边界事件处理右边界高度设为0以保证正确弹出堆的维护需要同时存储右边界坐标去重逻辑只有当最大高度变化时才记录关键点3.2 最小覆盖子串LC 76滑动窗口优化过程初始暴力解法枚举所有子串检查是否包含目标字符O(n^3)基础滑动窗口维护左右指针O(n)优化技巧使用counter记录字符需求额外变量记录满足条件的字符数前移左指针时跳过无关字符性能对比方法时间复杂度实际运行时间(ms)暴力O(n^3)3000 (TLE)基础滑动窗口O(n)120优化滑动窗口O(n)484. 效率提升实战技巧4.1 调试与验证方法小数据测试法先用手算验证简单case例如测试滑动窗口问题时print(Solution().minWindow(ADOBECODEBANC, ABC)) # 应输出BANC边界条件检查清单空输入极值情况如最大数据量重复元素处理正负零值可视化调试 对于图论问题可以用ASCII画图辅助理解0 —— 1 | \ | 2 34.2 常见优化模式空间换时间预计算前缀和记忆化搜索查表法双指针技巧快慢指针链表问题左右指针数组问题滑动窗口子串问题位运算优化使用掩码代替集合异或找唯一数位计数技巧4.3 个人效率工具链本地测试框架import unittest class TestSolutions(unittest.TestCase): def test_skyline(self): self.assertEqual(getSkyline([[2,9,10],[3,7,15]]), [[2,10],[3,15],[7,10],[9,0]]) if __name__ __main__: unittest.main()性能分析工具import cProfile cProfile.run(Solution().maxSlidingWindow([1,3,-1,-3,5,3,6,7], 3))代码片段管理 使用VS Code的Code Snippets功能保存常用模板{ Binary Search: { prefix: bisect, body: [ left, right 0, len(nums)-1, while left right:, mid left (right-left)//2, if nums[mid] target:, return mid, elif nums[mid] target:, left mid 1, else:, right mid - 1, return -1 ] } }5. 刷题记录的价值延伸5.1 面试复盘系统我将刷题记录与面试经历关联形成以下分析维度题目出现频率统计个人解题时间分布错误类型归类边界条件、算法选择等企业出题偏好分析5.2 技术博客素材精选典型题目记录加工为技术文章例如《从暴力解法到最优解滑动窗口问题的四层进阶》《如何用扫描线算法解决几何问题》《动态规划的降维优化技巧》5.3 个人能力雷达图基于刷题数据生成技能评估%% 注意实际使用时需替换为表格形式 radarChart title 算法能力评估 axis 数据结构, 动态规划, 图论, 搜索, 数学 当前 : 85, 70, 65, 80, 60 目标 : 90, 85, 75, 85, 70注此处mermaid图表仅为示意实际记录中使用表格代替技能维度当前水平目标水平数据结构8590动态规划7085图论算法6575搜索算法8085数学相关60706. 持续改进方向经过三年多的刷题实践我发现以下几个关键改进点刻意练习不再追求题目数量而是针对薄弱环节进行专题突破。比如最近两周集中攻克了10道树形DP问题。错题重做建立错题本对曾经做错的题目定期重做。统计显示第二次做题的正确率能提高40%以上。模拟面试使用Pramp等平台进行模拟面试适应在时间压力下的解题状态。真实面试环境下解题速度比平时慢30%左右。代码审查定期review自己三个月前的代码会发现很多可以优化的地方。比如最近重看之前的回溯代码发现有大量可以剪枝的优化点。教学相长在LeetCode讨论区解答他人问题这个过程常常能发现自己理解上的盲区。教是最好的学。