type
status
date
slug
summary
tags
category
icon
password
AI 初学者的 LeetCode 刷题计划
针对一位已掌握 Python 基本语法、计划从事人工智能方向工作的初学者,下面提供一个分阶段的 LeetCode 刷题详细计划。整体遵循由易到难的顺序,逐步涵盖基础数据结构、常见算法,再到与AI应用相关的矩阵和图像问题。每个阶段列出了练习目标、推荐题目和节奏建议,并结合 Python 编程提供提示。
第一阶段:基础易题与常用数据结构
- 阶段目标:打好算法基础,熟练使用数组、字符串、链表、栈、队列等常用数据结构,以及基本的哈希表操作和双指针技巧。通过简单题巩固对 Python 基本语法和内置数据类型的应用,培养算法思维。完成本阶段后,应能够解决大部分简单难度的问题,并了解部分典型的中等难度题。
推荐题目练习:(难度简单为主)
- LeetCode 1. 两数之和 – 数组、哈希(经典入门题,练习遍历数组和使用字典加速查找)
- LeetCode 20. 有效的括号 – 栈(利用栈检查括号匹配)
- LeetCode 21. 合并两个有序链表 – 链表(操作链表指针,合并排序链表)
- LeetCode 141. 环形链表 – 链表、双指针(快慢指针判定链表环)
- LeetCode 206. 反转链表 – 链表、迭代/递归(练习链表指针反转)
- LeetCode 125. 验证回文串 – 字符串、双指针(左右指针检查字符串回文)
- LeetCode 242. 有效的字母异位词 – 字符串、哈希(使用哈希表或排序检查异位词)
- LeetCode 217. 存在重复元素 – 数组、哈希(使用集合快速判断重复)
- LeetCode 136. 只出现一次的数字 – 数组、位运算(利用异或运算找出唯一的数)
- LeetCode 26. 删除有序数组中的重复项 – 数组、双指针(原地删除排序数组重复元素)
阶段节奏:本阶段题目难度低,数量约 10 道,可在1–2 周内完成。建议每天练习2–3题,充分利用碎片时间巩固基础。如果时间充裕可多做几题,尽快熟悉各种数据结构的基本用法。例如使用Python的
list
操作数组和栈,collections.deque
充当队列,dict/set
用于哈希表等。- Python 实现提示:注意善用 Python 内置函数和特性简化实现:
- 数组/链表操作中,可利用 Python 切片、列表推导式 提高效率,但也要理解底层原理(如切片复制开销)。
- 利用 字典 或 集合 实现哈希表功能(如两数之和中用字典存值以O(1)查找补数)。
- 栈和队列可分别使用
list.append()/pop()
和collections.deque
来实现;避免用list.pop(0)
模拟队列(因为其时间复杂度是O(n))。
- 字符串处理时充分利用 Python 的 内置函数(如
str.lower()
、正则)和切片操作来判断回文、反转字符串等。
- 对于链表问题,LeetCode会提供节点类定义,操作时注意区分引用与值拷贝,小心处理链表尾部
None
。反转链表可选择递归实现(注意递归深度)或迭代实现(循环调整指针)。
(参考:基础阶段应重点掌握数组、字符串、链表、栈/队列等数据结构,并能解决大部分简单题。)
第二阶段:搜索与排序算法实践
阶段目标:学习常用的搜索与排序算法思想,解决排序数组上的问题和简单的树遍历。通过本阶段练习,理解二分查找的实现及应用场景,掌握基本排序策略(如双指针排序、划分等),并初步接触广度/深度优先搜索(BFS/DFS)在树结构中的应用。此阶段问题难度提升至简单和中等混合,为后续更复杂的图算法和动态规划打下基础。
推荐题目练习:(难度简单/中等结合)
- LeetCode 704. 二分查找 – 数组、二分(实现基础二分查找算法)
- LeetCode 278. 第一个错误的版本 – 二分查找(二分应用,查找分界点)
- LeetCode 33. 搜索旋转排序数组 – 数组、二分(中等,旋转有序数组上进行二分查找)
- LeetCode 75. 颜色分类 – 排序、双指针(荷兰国旗问题,线性时间排序三个类别)
- LeetCode 88. 合并两个有序数组 – 数组、双指针(合并已排序数组,考察从后向前的双指针技巧)
- LeetCode 215. 数组中的第K个最大元素 – 排序、堆(中等,练习快速选择算法或使用最小堆)
- LeetCode 56. 合并区间 – 排序、数组(中等,排序区间并合并重叠部分)
- LeetCode 104. 二叉树的最大深度 – 树、DFS(递归求树高,初步体验DFS遍历)
- LeetCode 102. 二叉树的层序遍历 – 树、BFS(使用队列实现树的按层遍历)
注:本阶段同时涉及简单的二叉树遍历,以“搜索”广义概念包括对树的搜索。树是重要的数据结构,这里通过求深度和层序遍历熟悉 DFS 和 BFS 的基本操作。
阶段节奏:本阶段推荐问题数约 8~10 道,其中二分和排序类题目可以较快解决,而涉及思想稍复杂的中等题(如旋转数组查找、合并区间等)可能需要更多思考时间。预计用1–2 周完成。建议每天保持2题左右的节奏:先做一道二分或排序的简单题,再挑战一道偏中等的题。遇到困难时多画图辅助理解算法过程,例如二分查找的边界情况、合并区间的排序结果等。
- *Python 实现提示:**在实现搜索和排序算法时,注意以下技巧:
- 二分查找可使用Python的
bisect
模块简化查找插入位置,但仍建议亲手实现以掌握细节(比如左右边界的处理)。二分循环中注意避免死循环,计算中点索引时用mid = (low + high) // 2
。
- 排序相关问题中,Python内置的
sorted()
或list.sort()
实现了高效的Timsort算法。简单题可以直接使用内置排序并配合切片或内置函数解决。但在练习算法思想时,可尝试手动实现快速排序或归并排序来加深理解。
- 堆相关问题(如第K大元素)可使用
heapq
模块简化实现,比如构建最小堆然后弹出元素。但也应了解堆的原理和操作的时间复杂度。
- 双指针技巧在合并有序数组、颜色分类等题中很常用。用两个索引从数组两端或不同起点出发进行遍历时,要注意控制循环条件,避免指针越界。
- 对于树的遍历,Python的递归深度默认限制约为1000,二叉树一般不会太深无需修改。但使用DFS递归时需注意栈溢出可能性。BFS遍历可利用
collections.deque
高效实现队列操作。
- 在进行层序遍历等操作时,善用Python的多重赋值或循环解包技巧,比如一次性处理当前层的所有节点。
(参考:在掌握基础知识后,可按二分查找→排序→树的遍历逐步练习中等难度算法题。)
第三阶段:动态规划与图算法进阶
阶段目标:学习动态规划(Dynamic Programming)核心思想及常见问题类型,掌握图论相关的数据结构(图、邻接表等)和算法(包括泛化的DFS/BFS、拓扑排序等)。本阶段题目难度多为中等,涉及复杂度较高的算法思想,是对前两阶段基础的提升。通过动态规划练习,体会将复杂问题拆解为子问题的解题套路;通过图算法练习,理解在更抽象的网络结构上进行搜索和路径规划的方法。这些技能对AI领域也很重要,例如优化问题求解、路径寻找、资源调度等都可建模为DP或图问题。
推荐题目练习:(难度以中等为主)
- LeetCode 70. 爬楼梯 – 动态规划(斐波那契类简单DP,入门级DP)
- LeetCode 198. 打家劫舍 – 动态规划(经典一维DP,房屋间隔取最大和)
- LeetCode 322. 零钱兑换 – 动态规划(中等,硬币凑金额的最少硬币数,完全背包DP)
- LeetCode 300. 最长递增子序列 – 动态规划(中等,求数组最长递增序列长度,典型序列DP)
- LeetCode 200. 岛屿数量 – 图、DFS/BFS(二维网格寻连通块,练习图的遍历)
- LeetCode 133. 克隆图 – 图、BFS/DFS(图的遍历与拷贝,用哈希表保存访问状态)
- LeetCode 207. 课程表 – 图、拓扑排序(判断有向图是否有环,典型拓扑排序应用)
注:动态规划部分也可延伸练习更复杂的题目(如编辑距离、最长公共子序列等),视时间和精力酌情加入。本列表选取的是几道具有代表性的DP题。图算法方面,推荐先以 BFS/DFS 和拓扑排序为主;如果有兴趣,可进一步学习最短路径(Dijkstra算法)或并查集(Union-Find)等高级主题。
阶段节奏:预计用2–3 周完成本阶段练习。动态规划通常是初学者的难点,需要较多时间思考状态转移方程;图论问题有时也较烧脑。因此建议每天1–2题为宜,确保真正理解每题的解题思路,而非盲目刷量。一个可能的节奏是每天一道DP题+一道图论/树相关题交替进行,使得学习内容多样不枯燥。例如,先用一天时间攻克“零钱兑换”这样的DP问题,第二天切换到图的遍历来放松一下思维,再继续回到下一个DP问题。
- Python 实现提示:动态规划和图算法在Python中实现时,应注意:
- *动态规划:合理选择数据结构存储DP状态。对于一维DP,可用列表;二维DP可用嵌套列表(如
dp = [[0]*m for _ in range(n)]
)。计算状态转移时,多利用内置函数简化操作,例如求序列最优值可以用min()/max()
。递归+备忘录形式的DP可以借助functools.lru_cache
装饰器自动记忆子结果,但要注意Python的递归深度限制,必要时可增大递归限度或改用迭代。
- 图遍历:表示图时,可使用
defaultdict(list)
存储邻接表结构,或直接用字典映射节点->邻居列表。进行BFS时,推荐使用collections.deque
维护队列;进行DFS时,可使用递归或显式栈列表。请警惕递归栈溢出:当图节点很多或存在深链路,DFS递归可能超过Python默认栈深,需要改用迭代或设置递归限制。
- 拓扑排序:可借助
collections.deque
实现Kahn算法,或递归实现DFS拓扑排序。在实现Kahn算法时,Python的collections.Counter
可方便统计入度,deque
用于存放入度为0的节点序列。每弹出一个节点时更新邻居入度并计数。
- 性能考虑:本阶段一些问题输入规模较大,实现需注意优化。例如克隆图需要避免重复访问节点,可用字典缓存已克隆节点;岛屿数量问题中DFS递归访问标记过的格子以减少重复计算。
- 善用Python语言的简洁语法提高代码可读性,例如列表推导初始化DP数组、
for-else
结构检测环路(课程表问题可在DFS中用一个栈集合记录访问路径检测回路)等。
(参考:在动态规划和图算法阶段,可适当放慢节奏,先学习算法理论概念,再通过刷题实践巩固。)
第四阶段:矩阵与图像相关专项练习
阶段目标:结合前面所学,将练习重点放在矩阵、图像等与AI应用场景密切相关的问题上。许多人工智能任务涉及矩阵运算(如神经网络中的矩阵计算)或图像处理(如像素矩阵的操作)。通过这一阶段的练习,熟悉在二维数组上进行操作、搜索和模拟的技巧。题目涵盖矩阵变换、路径规划以及简单的图像处理模拟,让你在算法练习的同时对AI常见问题形式有所感知(例如图像旋转、区域填充、栅格路径规划等)。
推荐题目练习:(难度中等为主,少量简单题)
- LeetCode 48. 旋转图像 – 矩阵(将矩阵顺时针旋转90度,就地修改矩阵)
- LeetCode 73. 矩阵置零 – 矩阵(将矩阵中含0元素的行列清零,考察空间优化技巧)
- LeetCode 289. 生命游戏 – 矩阵、模拟(细胞自动机模拟,一次更新二维网格状态)
- LeetCode 661. 图片平滑器 – 矩阵、模拟(对图像像素矩阵进行平均平滑,邻域遍历)
- LeetCode 733. 图像渲染 – 图像、DFS/BFS(Flood Fill 算法,将连通区域填充为新颜色)
- LeetCode 695. 岛屿的最大面积 – 矩阵、DFS(类似岛屿数量问题,计算最大岛面积)
- LeetCode 79. 单词搜索 – 矩阵、回溯(在字符网格中搜索单词,典型DFS回溯应用)
- LeetCode 62. 不同路径 – 矩阵、动态规划(机器人在网格从起点到终点的路径计数)
- LeetCode 63. 不同路径 II – 矩阵、动态规划(含障碍物的路径计数,在62题基础上增加条件)
注:以上题目中,48/73题练习矩阵变换操作,289/661题模拟图像处理过程,733/695题涉及区域搜索(可类比图像中的连通域检测),79题是回溯在二维网格上的应用,而62/63题则是典型的网格路径规划问题(与机器人导航、AI中的路径搜索等场景相关)。这些题目综合运用了之前阶段的算法技巧,如双指针、DFS/BFS、动态规划等,非常适合作为收尾的综合练习。
阶段节奏:本阶段题目约 8~10 道,建议用1–2 周时间完成。由于题目多为中等难度,且矩阵操作繁琐,每天1-2题为宜。在刷题节奏上可以按照题目类型分组练习:先用1天时间掌握矩阵旋转与置零这类数组变换题,再花几天分别练习图像渲染/岛屿面积(练习DFS/BFS)、单词搜索(练习回溯)、生命游戏/图片平滑器(练习模拟),最后用1-2天攻克路径规划DP问题。合理分配难题和相对简单题的穿插顺序,保持练习动力。
- Python 实现提示:进行矩阵和图像相关题目编程时,应注意:
- 矩阵遍历:使用嵌套循环时,清晰区分行(row)列(col)索引;Python中遍历矩阵常用
for i in range(m): for j in range(n):
。处理邻居单元格时,可预先定义方向数组,如dirs = [(0,1),(0,-1),(1,0),(-1,0)]
方便遍历上下左右邻居。
- 原地修改:某些矩阵题要求“就地”操作(如旋转图像、矩阵置零)。就地算法往往需要技巧避免破坏尚未处理的位置。可以先记录需要修改的位置,再统一处理;或利用额外标记(例如矩阵置零可用第一行第一列作为标志位)来降低空间复杂度。
Python高级用法:对于矩阵旋转等操作,Python提供了一些简洁技巧,例如利用
zip
和切片:matrix[:] = map(list, zip(*matrix[::-1]))
能直接实现顺时针旋转矩阵。但建议初次尝试先用常规方法理解原理,再使用这种Python“一行代码”技巧。- DFS/BFS:在网格上进行DFS/BFS(如733题填色、695题找岛)时,递归DFS需要注意栈深度(最大可能遍历整个矩阵,可达数百元素,Python递归基本可承受)。BFS需防止重复访问,可以维护visited集合或直接修改原矩阵标记访问(如将访问过的陆地改为水)。
- 模拟与状态更新:生命游戏(289题)要求同时更新细胞状态,解决办法是在计算新状态时避免直接覆盖影响后续计算。一种技巧是在原矩阵中使用位或额外标志保存两种状态:例如用整数的某二进制位存储“下一状态”,最后统一移位完成更新。在Python中也可以先拷贝矩阵计算新状态,再赋回原矩阵,视空间换时间的权衡而定。
- 动态规划(62/63题):此类网格DP通常有递推公式,例如
dp[i][j] = dp[i-1][j] + dp[i][j-1]
,注意边界初始化(起点路径数为1)。Python实现时,小心处理有障碍物的情况,可用条件判断将有障碍的位置dp值置0。利用二维列表推导可方便地初始化DP数组。如遇到大网格,尽量使用迭代而非递归,以免Python递归过深。
(参考:矩阵与图像类问题常见于算法练习题单;通过这些题目能加强对AI相关数据形式(图像、网格)的算法处理能力。)
总结:按照以上四个阶段由浅入深地刷题,可以循序渐进地掌握数据结构与算法的精髓,为日后从事AI相关工作打下坚实基础。整个规划题目总数在40题左右,如果每天坚持刷1–4题,大约2个月内可以完整走完一遍。在刷题过程中,建议配合学习算法理论和经典案例,加深理解而非仅追求AC(Accepted)。每一阶段完成后,回顾总结解题的套路和范式(例如双指针什么时候用,动态规划如何定义状态和转移等)。同时,坚持编写Python代码来实现解法,积累代码模板和经验。通过这样的训练,当面对实际AI应用中的问题(例如模型参数优化、图像处理流程、路径搜索等),你将能熟练运用算法思维,用代码优雅地加以解决。
祝你的刷题之旅顺利,高效提升算法能力!坚持每日刷题并不断反思,相信在不久的将来,你将能够自信地应对AI领域的技术挑战。👏
- 作者:sisui
- 链接:https://www.sisui.me//article/leetcode
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章