新手leetcode快速刷题指南
- 前言:
- 我们的新手LeetCode刷题入门指南:
- python基础语法与数据结构
-
- [🧩 一、Python 基础语法概览](#🧩 一、Python 基础语法概览)
- [🧮 二、数据类型(核心:list、dict、str)](#🧮 二、数据类型(核心:list、dict、str))
- [🔁 三、控制结构(逻辑与循环)](#🔁 三、控制结构(逻辑与循环))
- [🧰 四、函数(刷题常用模板)](#🧰 四、函数(刷题常用模板))
-
- [🧩 四点五、函数参数怎么传?](#🧩 四点五、函数参数怎么传?)
- [🧮 五、return](#🧮 五、return)
- [🧩 六、列表推导式(Python简洁写法)](#🧩 六、列表推导式(Python简洁写法))
- [🔧 七、常用内置函数](#🔧 七、常用内置函数)
- [🔤 八、字符串操作(常考!)](#🔤 八、字符串操作(常考!))
- [🧮 九、常用库(刷题只需了解)](#🧮 九、常用库(刷题只需了解))
- leetcode刷题通用解题流程:
-
- [1. 最实用的 5 步:](#1. 最实用的 5 步:)
- [2. 🥉常用算法分类](#2. 🥉常用算法分类)
- [3. 🧠 刷题最常用的 8 个 Python 小技巧](#3. 🧠 刷题最常用的 8 个 Python 小技巧)
-
- 1)复杂度(先会这三句就能选方法)
- [2)排序怎么写(LeetCode 高频)](#2)排序怎么写(LeetCode 高频))
- [3)哈希表计数(不用写 if)](#3)哈希表计数(不用写 if))
- [4)队列 BFS(树/图最常用)](#4)队列 BFS(树/图最常用))
- [5)TopK / "总拿最小的那个"(用堆)](#5)TopK / “总拿最小的那个”(用堆))
- 6)二分(找"左边界/插入位置")
- 7)递归记忆化(避免重复计算,DP/搜索常用)
- [8)list 的拷贝(刷题很常用)](#8)list 的拷贝(刷题很常用))
- 题型模板区(直接抄)
- [1)哈希表模板(Two Sum 类)](#1)哈希表模板(Two Sum 类))
- 2)双指针模板(有序数组/左右夹逼)
- 3)滑动窗口模板(最长/最短子数组)
- 4)栈模板(有效括号)
- [5)BFS 队列模板(最短路径/层序遍历)](#5)BFS 队列模板(最短路径/层序遍历))
- 6)二分模板(找左边界)
- 7)回溯模板(子集/组合)
- [8)DP 模板(爬楼梯)](#8)DP 模板(爬楼梯))
- [如何在本地编译测试 LeetCode 代码](#如何在本地编译测试 LeetCode 代码)
-
- 1)站内模板(LeetCode)
- 2)本地模板(使用断言)
- [3)本地示例:Two Sum(哈希表)](#3)本地示例:Two Sum(哈希表))
- 4) 如何自己设计测试样例? 如何自己设计测试样例?)
前言:
我们现在准备刷题了,时间紧、任务重,希望快速上手。只学对刷题最有用的 20% Python 知识,先能写题、跑通、过样例,再逐步变强。
首先我们刷题前要知道的
- 我们在 LeetCode 写的 Python算法题,绝大多数都是:
用 list/dict(数组/哈希表)+ 循环 + if ,配合几个常用库(collections / heapq / bisect / functools)和固定模板(双指针/栈/队列/BFS/二分/回溯/DP)就能解决:
然后开始我们的新手LeetCode刷题入门指南。
我们的新手LeetCode刷题入门指南:
python基础语法与数据结构
- 数据类型 :
int,float,str,list,dict,set,tuple - 控制结构 :
if/else,for,while - 函数 :定义
def, 参数与返回值 - 列表推导式(简洁写法)
- 常见内置函数 :
len,sum,max,min,sorted,enumerate,zip - 字符串操作 :
split,join,strip,replace - 常用库 (入门阶段先知道即可):
collections,math
🧩 一、Python 基础语法概览
| 模块 | 要掌握的知识 | 关键语法 | 举例 | 对刷题的帮助 |
|---|---|---|---|---|
| 变量与类型 | 不需要声明类型,直接赋值即可 | a = 10、b = "hi" |
x = 3.14、name = "Alice" |
编程更快,不用int/char定义 |
| 输入输出 | input()读入字符串;print()输出 |
s = input();print(x) |
print("答案:", ans) |
用来调试或输出结果 |
| 注释 | 单行用 #,多行用三引号 |
# 这是注释 |
'''多行注释''' |
写题解说明、调试 |
| 缩进 | 控制代码块,无大括号 {} |
if x>0:\n print(x) |
-- | 必须保持统一(常为4空格) |
🧮 二、数据类型(核心:list、dict、str)
| 类型 | 定义方式 | 常用操作 | 示例 | 刷题用途 |
|---|---|---|---|---|
| int / float | a = 10;b = 3.14 |
+ - * / // % |
5 // 2 -> 2(整除) |
计数、取模、循环控制 |
| str(字符串) | 'abc' 或 "abc" |
s[i]取字符;len(s)长度 |
"abc"[1] -> 'b' |
处理文本、回文串 |
| list(列表) | [1, 2, 3] |
append(x),pop(),len(),切片a[1:3] |
nums = [1,2,3]; nums.append(4) |
最常用容器! |
| dict(字典/哈希表) | {"a":1, "b":2} |
d["a"]取值;d.keys();d.get("x",0) |
cnt = {"a":1};cnt["a"]+=1 |
高频题结构(Two Sum) |
| set(集合) | {1,2,3} |
add(x),remove(x),in判断 |
s = {1,2}; 3 in s -> False |
去重、判断是否出现 |
| tuple(元组) | (1,2,3) |
不可修改,用于返回多个值 | return (x, y) |
函数多返回值、排序key |
🔁 三、控制结构(逻辑与循环)
| 结构 | Python写法 | 示例 | 说明 |
|---|---|---|---|
| if / elif / else | if 条件: |
if x>0:\n print("正")\nelif x==0:\n print("零")\nelse:\n print("负") |
注意冒号:和缩进 |
| for循环 | for 变量 in 序列: |
for i in range(5): print(i) |
range(n)表示0到n-1 |
| while循环 | while 条件: |
while n>0:\n n-=1 |
同C语言逻辑 |
| break / continue | 同C语言 | if i==3: break |
控制循环流 |
| for...else(特殊) | 循环正常结束后执行else |
搜索时常用 | 不掌握也行,了解即可 |
🧰 四、函数(刷题常用模板)
| 内容 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 定义函数 | def 函数名(参数): |
def add(a,b): return a+b |
没有类型声明 |
| 返回值 | return |
return x, y |
可返回多个值 |
| 默认参数 | def f(x=0): ... |
f() = f(0) |
常用在递归中 |
| 匿名函数 | lambda x: x+1 |
map(lambda x:x+1, arr) |
列表排序、函数式操作 |
🧩 四点五、函数参数怎么传?
Python 传参基本就是"传对象的引用"。
关键是:
int/str/tuple不可变对象:函数里改它,外面不变。
list/dict/set可变对象:函数里改内容,外面会变。
常见错误1:不要用可变对象当默认参数(可变对象默认参数正确写法)
❌ 错误做法:
python
def f(path=[]):
path.append(1)
return path
- 默认参数
path=[]在函数定义时初始化一次,之后每次函数调用都使用这个初始生成的同一个列表。
✅ 正确做法:
python
def f(path=None):
if path is None:
path = []
path.append(1)
return path
- 使用
None作为默认值,每次函数调用时都会创建一个新的空列表。 - 避免了默认参数值被共享的问题,每次调用都返回一个独立的列表。
常见错误2:回溯/DFS里要用path[:]等浅拷贝
因为 path 是 list(可变),你要"存档一份当时的快照",就得拷贝:
python
ans = []
path = []
def dfs(i):
if i == 3:
ans.append(path[:]) # 关键:拷贝一份
return
path.append(i)
dfs(i+1)
path.pop()
dfs(0)
print(ans)
(这里可以看一下我们上一篇的帖子,了解一下常见的直接赋值,浅拷贝,深拷贝的错误和理解。)
🧮 五、return
| 目的 | 写法 | 例子 |
|---|---|---|
| 返回单个值 | return value |
return "ok" |
| 返回多个值 | return a, b, c |
return q, r |
| 返回列表 | return [ ... ] |
return [i, j] |
| 返回字典 | return { ... } |
return {"a":1,"b":2} |
| 不返回/占位 | return 或省略 |
return(等价 None) |
补充说明pass
如果你的函数暂时不需要写什么内容,可以补充一个pass当占位符
-
pass语句 :用于语法上需要语句但什么也不做的场景(如函数、类、循环的占位),例如:pythondef todo(): pass # 暂时不写实现 if condition: pass # 稍后处理
🧩 六、列表推导式(Python简洁写法)
| 功能 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 创建列表 | [表达式 for 变量 in 序列] |
[i*i for i in range(5)] → [0,1,4,9,16] |
简洁、常用 |
| 带条件 | [x for x in nums if x>0] |
[x for x in [1,-2,3] if x>0] → [1,3] |
常用于过滤 |
💡刷题常见用法:
python
nums = [int(x) for x in input().split()]
(把输入的一行数字变成整型数组)
🔧 七、常用内置函数
| 函数 | 用法 | 示例 | 常见用途 |
|---|---|---|---|
len() |
求长度 | len(nums) |
数组、字符串长度 |
sum() |
求和 | sum(nums) |
快速统计 |
max() / min() |
最大/最小 | max(nums) |
|
sorted() |
排序 | sorted(nums, reverse=True) |
|
enumerate() |
获取下标和值 | for i, val in enumerate(nums): |
常用于遍历 |
zip() |
打包多个序列 | for a,b in zip(nums1,nums2): |
同步遍历两个数组 |
any() |
任一为真 | any(x<0 for x in nums) |
条件判断 |
all() |
全部为真 | all(x>=0 for x in nums) |
条件判断 |
🔤 八、字符串操作(常考!)
| 操作 | 用法 | 示例 | 说明 |
|---|---|---|---|
split() |
按空格拆分字符串 | "a b c".split() → ['a','b','c'] |
输入解析 |
join() |
合并列表为字符串 | ",".join(['a','b']) → "a,b" |
输出格式化 |
strip() |
去掉首尾空白 | " abc ".strip() → "abc" |
|
replace() |
替换子串 | "aba".replace('a','x') → "xbx" |
|
| 切片 | s[l:r] |
"abcd"[1:3]="bc" |
子串 |
🧮 九、常用库(刷题只需了解)
| 库/工具 | 一句话核心功能(新手友好版) | 最简示例(可以直接抄) | 常用场景 |
|---|---|---|---|
math |
常用数学计算(平方根、向上取整、最大公约数等) | math.sqrt(x) math.ceil(x) math.gcd(a,b) |
数论、几何、计算题 |
collections.Counter |
统计列表元素出现次数 | cnt = Counter(nums) |
频次统计、词频分析 |
collections.defaultdict |
访问不存在的键时自动初始化默认值 | d = defaultdict(list) d[key].append(val) |
分组统计、邻接表 |
collections.deque |
双端队列:头尾都能快速增删 | q = deque([1,2]) q.append(3); q.popleft() |
BFS、滑动窗口 |
heapq |
最小堆:随时获取最小值 | heappush(h, x) min_val = heappop(h) |
TopK、合并有序列表 |
bisect |
二分查找:在有序列表中找插入位置 | pos = bisect_left(arr, x) |
二分搜索边界 |
functools.lru_cache |
记忆化装饰器:缓存递归结果 | @lru_cache(maxsize=None) |
递归DP、记忆化搜索 |
leetcode刷题通用解题流程:
1. 最实用的 5 步:
- 读题 + 确认输入输出(是否有序?允许重复?范围?)
- 选方法(哈希/双指针/栈/队列/BFS/二分/回溯/DP...)
- 估复杂度(目标一般 O(n) 或 O(n log n))
- 写代码(先写最小可行版本跑通样例)
- 测边界(空、单元素、极端、重复、负数/特殊字符)
2. 🥉常用算法分类
目标:能分析时间复杂度、选择合适的数据结构解题。
目标:能看出题目属于哪一类,直接套模板。
- 哈希表
- 双指针 / 滑动窗口
- 栈
- 队列 / BFS
- 二分查找
- 递归 / 回溯
- 动态规划(DP)
- 堆(TopK/最小最大)
3. 🧠 刷题最常用的 8 个 Python 小技巧
1)复杂度(先会这三句就能选方法)
- 扫一遍数组:通常 O(n)
- 排序:通常 O(n log n)
- 双重循环:通常 O(n^2)(n 大会超时)
2)排序怎么写(LeetCode 高频)
python
a.sort() # 升序
a.sort(reverse=True) # 降序
a.sort(key=lambda x: x[1]) # 按第2个元素排序(二维数组/区间)
3)哈希表计数(不用写 if)
python
from collections import defaultdict
cnt = defaultdict(int)
for x in nums:
cnt[x] += 1
4)队列 BFS(树/图最常用)
python
from collections import deque
q = deque([start])
while q:
cur = q.popleft()
5)TopK / "总拿最小的那个"(用堆)
python
import heapq
h = []
heapq.heappush(h, 3)
heapq.heappush(h, 1)
x = heapq.heappop(h) # 1(最小的先出来)
6)二分(找"左边界/插入位置")
python
from bisect import bisect_left
i = bisect_left([1,2,4,4,7], 4) # i == 2
7)递归记忆化(避免重复计算,DP/搜索常用)
python
from functools import lru_cache
@lru_cache(None)
def f(i):
if i <= 1:
return 1
return f(i-1) + f(i-2)
8)list 的拷贝(刷题很常用)
python
b = a[:] # 拷贝一份(避免一起变)
# ans.append(path[:]) 也是同样道理
题型模板区(直接抄)
1)哈希表模板(Two Sum 类)
python
class Solution:
def twoSum(self, nums, target):
pos = {}
for i, x in enumerate(nums):
y = target - x
if y in pos:
return [pos[y], i]
pos[x] = i
return []
2)双指针模板(有序数组/左右夹逼)
python
class Solution:
def twoSumSorted(self, nums, target):
l, r = 0, len(nums) - 1
while l < r:
s = nums[l] + nums[r]
if s == target:
return [l, r]
elif s < target:
l += 1
else:
r -= 1
return [-1, -1]
3)滑动窗口模板(最长/最短子数组)
python
class Solution:
def minSubArrayLen(self, target, nums):
n = len(nums)
l = 0
s = 0
ans = float('inf')
for r in range(n):
s += nums[r]
while s >= target:
ans = min(ans, r - l + 1)
s -= nums[l]
l += 1
return 0 if ans == float('inf') else ans
4)栈模板(有效括号)
python
class Solution:
def isValid(self, s: str) -> bool:
pair = {')': '(', ']': '[', '}': '{'}
st = []
for ch in s:
if ch in "([{":
st.append(ch)
else:
if not st or st[-1] != pair.get(ch, '#'):
return False
st.pop()
return not st
5)BFS 队列模板(最短路径/层序遍历)
python
from collections import deque
class Solution:
def bfs(self, start):
q = deque([start])
visited = set([start])
while q:
cur = q.popleft()
# 处理 cur
for nxt in []: # 这里替换成邻居列表
if nxt not in visited:
visited.add(nxt)
q.append(nxt)
6)二分模板(找左边界)
python
class Solution:
def lowerBound(self, nums, target):
l, r = 0, len(nums) # 注意 r = len(nums)
while l < r:
mid = (l + r) // 2
if nums[mid] >= target:
r = mid
else:
l = mid + 1
return l
7)回溯模板(子集/组合)
python
class Solution:
def subsets(self, nums):
ans = []
path = []
def dfs(i):
if i == len(nums):
ans.append(path[:]) # 拷贝快照
return
# 不选
dfs(i + 1)
# 选
path.append(nums[i])
dfs(i + 1)
path.pop()
dfs(0)
return ans
8)DP 模板(爬楼梯)
python
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
a, b = 1, 2
for _ in range(3, n + 1):
a, b = b, a + b
return b
如何在本地编译测试 LeetCode 代码
1)站内模板(LeetCode)
python
class Solution:
def yourMethod(self, ...):
# 1) 参数检查(可选)
# 2) 初始化
# 3) 主循环 / 递归
# 4) 返回结果
pass
2)本地模板(使用断言)
python
class Solution:
def yourMethod(self, param1, param2):
# 你的方法实现
pass
def test_your_method():
s = Solution()
assert s.yourMethod(param1, param2) == "expected_value"
if __name__ == "__main__":
test_your_method()
print("All tests passed.")
3)本地示例:Two Sum(哈希表)
-
LeetCode 页面有「自定义测试用例」输入框,直接贴 JSON 风格输入即可。
-
例如 Two Sum:
-
输入:
[2,7,11,15] 9 ......
-
-
本地使用断言测试时,把这些样例输入我们创建的方法入口中
python
class Solution:
def twoSum(self, nums, target):
pos = {}
for i, x in enumerate(nums):
y = target - x
if y in pos:
return [pos[y], i]
pos[x] = i
return []
def test_two_sum():
s = Solution()
assert s.twoSum([2,7,11,15], 9) == [0,1]
assert s.twoSum([3,3], 6) == [0,1]
assert s.twoSum([-1,-2,-3,-4,-5], -8) == [2,4]
if __name__ == "__main__":
test_two_sum()
print("All tests passed.")
4) 如何自己设计测试样例?
口诀:空、单元素、极端、重复、负数/特殊字符
| 题型 | 必备样例 | 说明/目的 |
|---|---|---|
| 数组查找/哈希 | 正常用例;重复元素 ;负数 ;目标不存在/多解(看题目是否保证有解) | 覆盖哈希查找的关键分支 |
| 双指针/滑窗 | 已排序 & 未排序;窗口极小/极大 ;全不满足/全满足 | 检查左右边界更新是否正确 |
| 字符串 | 空串;单字符;大小写混合;含空格或标点;Unicode(了解即可) | 检验遍历与条件过滤 |
| 栈/队列 | 合法序列;非法但长度接近;嵌套深度很深 | 易错在出栈时机与匹配 |
| 二分 | 目标在头/尾;不存在;全相等;有重复的最左/最右 | 检查 mid & 边界收缩 |
| 动态规划 | n=0/1 的最小规模;最大规模;边界转移(如 0/负数) | 检验初值与转移式 |
| 链表 | 空链;单节点;环/无环(看题);头尾操作 | 指针移动与返回头结点 |
| 树 | 空树;单节点;只有左/右子树;完全/不完全 | 递归 base case 是否健壮 |