写给算法小白的模板指南

39 阅读4分钟

写给算法小白的模板指南

——零基础也能快速上手的编程解题套路


图片.png

🌟 为什么你需要“模板”?

很多初学者面对算法题时,常常卡在:

  • “不知道从哪开始写”
  • “看懂了答案,但自己写不出来”
  • “每道题都像新题,没法举一反三”

其实,90% 的基础算法题都有固定套路!
掌握几个核心模板,就能解决大部分面试和练习中的常见问题。


✅ 通用解题四步法(适用于所有题目)

  1. 理解题意:用自己的话复述题目,确认输入输出。
  2. 想例子:手动算一个小例子(比如数组 [1,2,3]),理清过程。
  3. 选模板:判断属于哪种类型(下面会讲)。
  4. 写代码 + 调试:套模板,填细节,用例子测试。

🔑 五大高频算法模板(附代码框架)

模板 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)

适用场景:求最值、计数、存在性问题(有重叠子问题)。

步骤:
  1. 定义 dp[i] 表示什么(比如“到第 i 个位置的最大收益”)
  2. 找状态转移方程(dp[i] = max(dp[i-1], dp[i-2] + nums[i])
  3. 初始化 base case(dp[0] = ...
  4. 返回 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)”二分查找
“两个数”、“去重”、“滑动窗口”双指针

💡 给小白的建议

  1. 先背模板,再理解:就像学写字先描红。
  2. 每类题刷 3~5 道:巩固模板用法。
  3. 手动画执行过程:比如画递归树、BFS 队列变化。
  4. 不要死记代码:记住思路结构比记住具体写法更重要。
  5. 从简单题开始:LeetCode 标签里选 “Easy”。

📚 推荐练习顺序

  1. 双指针 → 二分查找 → BFS → 回溯 → 动态规划

  2. 每个模板先做这些经典题:


记住:算法不是天赋,而是套路 + 练习。
你不需要“灵光一现”,只需要识别题型 + 套用模板!