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领域的技术挑战。👏
5.py-递归函数及装饰器函数6.py-类和对象的基本概念及属性和方法的常见分类和使用场景
Loading...