1. LeetCode刷题第七天:我的算法进阶之路
今天是我坚持LeetCode每日刷题计划的第七天,作为一个从零开始系统学习算法的开发者,我想记录下这一周来的真实感受和具体收获。很多人说刷LeetCode就像健身,前三天热情高涨,第七天开始找借口放弃——但我想证明,只要方法得当,任何人都能跨过这个门槛。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第七天的题目选择与策略
2.1 今日题目清单
今天选择了三道不同难度的题目:
- 简单题:20. 有效的括号(复习)
- 中等题:46. 全排列
- 困难题:51. N皇后
我刻意安排了这样的组合:一道已经AC过的题目用来巩固,一道中等题训练回溯思维,一道困难题挑战极限。这种"复习+进阶+挑战"的模式,实测下来比单纯刷同难度题目效果更好。
2.2 时间分配方案
我的时间分配比例是1:2:3:
- 有效括号:15分钟(含多种解法实现)
- 全排列:30分钟(重点理解回溯模板)
- N皇后:45分钟(允许自己查看题解)
这样的分配既保证了基础扎实度,又给难题留足了思考空间。特别建议在刷题早期不要死磕难题,适当看题解学习优秀思路反而效率更高。
3. 有效括号的多种解法对比
3.1 基础栈解法
这是大多数人的第一思路,用栈来处理括号匹配:
python复制def isValid(s: str) -> bool:
stack = []
mapping = {')': '(', '}': '{', ']': '['}
for char in s:
if char in mapping:
top = stack.pop() if stack else '#'
if mapping[char] != top:
return False
else:
stack.append(char)
return not stack
注意:这里使用'#'作为默认值是个小技巧,比直接判断stack是否为空更简洁
3.2 字符串替换法
一个不太常见但有趣的解法:
python复制def isValid(s: str) -> bool:
while '()' in s or '{}' in s or '[]' in s:
s = s.replace('()', '').replace('{}', '').replace('[]', '')
return not s
虽然时间复杂度升到O(n²),但在实际面试中展示这种不同角度的解法,往往能给面试官留下深刻印象。
4. 全排列问题的回溯框架
4.1 标准回溯实现
46题是理解回溯算法的经典案例:
python复制def permute(nums: List[int]) -> List[List[int]]:
res = []
def backtrack(path, choices):
if not choices:
res.append(path.copy())
return
for i in range(len(choices)):
path.append(choices[i])
backtrack(path, choices[:i]+choices[i+1:])
path.pop()
backtrack([], nums)
return res
4.2 常见误区分析
很多初学者(包括第七天的我)容易犯这些错:
- 忘记path.copy():会导致所有结果都指向同一个列表
- 错误切片:choices[i+1:]写成choices[i+1]会报错
- 终止条件写错:应该检查choices而非path的长度
实测建议:在IDE里单步调试回溯过程,观察path和choices的变化,比干看代码理解快十倍
5. N皇后问题的突破过程
5.1 从全排列到N皇后
发现51题和46题的内在联系是今天的最大收获。N皇后本质是在排列棋盘行的同时,增加对角线检查:
python复制def solveNQueens(n: int) -> List[List[str]]:
res = []
def backtrack(queens, xy_diff, xy_sum):
p = len(queens)
if p == n:
res.append(queens)
return
for q in range(n):
if q not in queens and p-q not in xy_diff and p+q not in xy_sum:
backtrack(queens+[q], xy_diff+[p-q], xy_sum+[p+q])
backtrack([], [], [])
return [["."*i + "Q" + "."*(n-i-1) for i in sol] for sol in res]
5.2 优化技巧
- 用一维数组表示皇后位置:queens[i]表示第i行的皇后列数
- 对角线检查的数学技巧:
- 主对角线:行号-列号为常数
- 副对角线:行号+列号为常数
- 生成棋盘时使用列表推导式,比逐行拼接效率更高
6. 一周刷题的数据复盘
6.1 七日数据统计
| 日期 | 总题数 | 简单 | 中等 | 困难 | 平均用时 |
|---|---|---|---|---|---|
| Day1 | 3 | 2 | 1 | 0 | 25min |
| Day2 | 3 | 1 | 2 | 0 | 35min |
| ... | ... | ... | ... | ... | ... |
| Day7 | 3 | 1 | 1 | 1 | 50min |
6.2 进步明显的指标
- 中等题AC时间从60min降到30min
- 能独立写出回溯框架
- 开始尝试困难题并理解解法
7. 持续刷题的经验总结
- 建立题目分类笔记:按算法类型整理模板代码
- 合理使用题解:看最优解前先自己尝试
- 周期性复习:每三天回顾一次错题
- 保持节奏:即使某天只做一道题也要坚持
今天最大的感悟是:当N皇后的代码第一次通过所有测试用例时,那种突破自我的成就感,比任何游戏通关都来得真实。这或许就是算法之美——在严谨的逻辑中,找到创造性的解决方案。
