写给算法小白的模板指南
——零基础也能快速上手的编程解题套路
🌟 为什么你需要“模板”?
很多初学者面对算法题时,常常卡在:
- “不知道从哪开始写”
- “看懂了答案,但自己写不出来”
- “每道题都像新题,没法举一反三”
其实,90% 的基础算法题都有固定套路!
掌握几个核心模板,就能解决大部分面试和练习中的常见问题。
✅ 通用解题四步法(适用于所有题目)
- 理解题意:用自己的话复述题目,确认输入输出。
- 想例子:手动算一个小例子(比如数组
[1,2,3]),理清过程。 - 选模板:判断属于哪种类型(下面会讲)。
- 写代码 + 调试:套模板,填细节,用例子测试。
🔑 五大高频算法模板(附代码框架)
模板 1:双指针(Two Pointers)
适用场景:数组/字符串中找两个数、去重、滑动窗口等。
类型 A:左右指针(向中间靠拢)
def two_sum_sorted(nums, target):
left, right = 0, len(nums) - 1
while left < right:
s = nums[left] + nums[right]
if s == target:
return [left, right]
elif s < target:
left += 1
else:
right -= 1
return []
✅ 典型题:两数之和(有序数组)、反转字符串、回文判断
类型 B:快慢指针(同向移动)
def remove_duplicates(nums):
slow = 0
for fast in range(len(nums)):
if nums[fast] != nums[slow]:
slow += 1
nums[slow] = nums[fast]
return slow + 1
✅ 典型题:删除重复项、移除元素、链表找环
模板 2:二分查找(Binary Search)
适用场景:在有序数组中快速找目标值或边界。
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 未找到
⚠️ 注意:
- 循环条件通常是
left <= right- 搜索左边界?把
right = mid - 1改成right = mid,最后返回left- 搜索右边界?把
left = mid + 1改成left = mid,最后返回right
✅ 典型题:搜索插入位置、猜数字、旋转数组最小值
模板 3:BFS(广度优先搜索)
适用场景:求最短路径、层序遍历、图的连通性。
from collections import deque
def bfs(start, target):
queue = deque([start])
visited = set([start])
while queue:
node = queue.popleft()
if node == target:
return True
for neighbor in get_neighbors(node):
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return False
✅ 典型题:岛屿数量、打开转盘锁、二叉树层序遍历
模板 4:DFS / 回溯(深度优先搜索)
适用场景:组合、排列、子集、路径枚举(需要“尝试+撤销”)。
def backtrack(path, choices, result):
if 满足结束条件:
result.append(path[:]) # 注意拷贝!
return
for choice in choices:
path.append(choice) # 做选择
backtrack(path, 新choices, result)
path.pop() # 撤销选择(回溯!)
✅ 典型题:全排列、组合总和、N皇后、括号生成
模板 5:动态规划(DP)
适用场景:求最值、计数、存在性问题(有重叠子问题)。
步骤:
- 定义
dp[i]表示什么(比如“到第 i 个位置的最大收益”) - 找状态转移方程(
dp[i] = max(dp[i-1], dp[i-2] + nums[i])) - 初始化 base case(
dp[0] = ...) - 返回
dp[n]或dp[-1]
# 例子:打家劫舍
def rob(nums):
if not nums: return 0
n = len(nums)
dp = [0] * (n + 1)
dp[1] = nums[0]
for i in range(2, n + 1):
dp[i] = max(dp[i-1], dp[i-2] + nums[i-1])
return dp[n]
✅ 典型题:爬楼梯、最大子数组和、背包问题、编辑距离
🧩 如何判断用哪个模板?
| 题目关键词 | 可能模板 |
|---|---|
| “最短路径”、“最少步数” | BFS |
| “所有组合”、“所有排列” | 回溯 |
| “最大/最小值”、“最多/最少” | 动态规划 |
| “有序数组”、“log(n)” | 二分查找 |
| “两个数”、“去重”、“滑动窗口” | 双指针 |
💡 给小白的建议
- 先背模板,再理解:就像学写字先描红。
- 每类题刷 3~5 道:巩固模板用法。
- 手动画执行过程:比如画递归树、BFS 队列变化。
- 不要死记代码:记住思路结构比记住具体写法更重要。
- 从简单题开始:LeetCode 标签里选 “Easy”。
📚 推荐练习顺序
-
双指针 → 二分查找 → BFS → 回溯 → 动态规划
-
每个模板先做这些经典题:
- 双指针:26. 删除有序数组中的重复项
- 二分:704. 二分查找
- BFS:102. 二叉树的层序遍历
- 回溯:78. 子集
- DP:70. 爬楼梯
✨ 记住:算法不是天赋,而是套路 + 练习。
你不需要“灵光一现”,只需要识别题型 + 套用模板!