Skip to content

算法框架

一、数据结构

1. 字符串

2. 数组

最底层的数据结构,内存连续,读写 O(1),一般出现在双指针、滑动窗口等题目中

常见技巧描述示例
二分查找x,f(x),target 三件套704.二分查找
34.在排序数组中查找元素的第一个和最后一个位置
双指针快慢指针,两端向中心指针,中心向两端指针27.移除元素
977.有序数组的平方
26.删除有序数组中的重复项
滑动窗口双指针变种,解决子数组问题,有明确的扩大或缩小窗口的条件209.长度最小的子数组
模拟行为循环不变量原则59.螺旋矩阵II
前缀和时间复杂度 O(1),空间换时间,频繁查询某个区间的累积和303.区域和检索
560.和为K的子数组
差分数组前缀和的“逆运算”,频繁对原始数组的某个区间的元素进行增减1109.航班预订统计
并查集由子结点找到父亲结点,处理一些集合的合并与查询130.被围绕的区域

3. 链表

最底层的数据结构,插入删除 O(1),一般从链表的头部/尾部开始访问

常见技巧描述示例
链表操作增删改查707.设计链表
83.删除排序链表中的重复元素
递归递归三要素203.移除链表元素
206.反转链表
24.两两交换链表中的节点
19.删除链表的倒数第N个结点
双指针快慢指针,两端向中心指针,中心向两端指针203.移除链表元素
206.反转链表
24.两两交换链表中的节点
19.删除链表的倒数第N个结点
哈希表空间换时间160.相交链表
142.环形链表

4. 哈希表

KV,底层通过数组/链表实现,一般用来快速判断一个元素是否出现集合里统计频次

常见技巧描述示例
哈希表统计频次242.有效的字母异位词
1002.查找共用字符
202.快乐数

5. 栈和队列

栈:先入后出,可用来进行深度优先搜索

队列:先入先出,可用来进行广度优先搜索

6. 二叉树

二叉树可以链式存储,也可以顺序存储。链式存储方式就用链表实现, 顺序存储的方式就是用数组实现。

7. 图论

二、算法思维

1. 双指针

分为快慢指针、左右指针

2. 前缀和

3. 差分数组

4. 二分查找

5. 排序算法

6. 滑动窗口

7. 单调栈

8. 并查集

9. BFS 和 DFS

BFS:深度优先遍历,可分为前序/中序/后序

DFS:广度优先遍历,可分为层次/层序

10. LRU 和 LFU

LRU:最近最少使用的缓存淘汰算法,哈希链表、双链表

LFU:最久未使用的缓存淘汰算法,哈希链表、双链表

11. 递归

容易联想到栈,深度优先遍历,自顶向下,通过 f(n)递归 f(n-1)

12. 回溯算法

N 叉树的深度优先遍历

13. 动态规划

一般用于求最值的场景

自底向上并不是 i 从 0 到 n,也可能从 n 到 0,如果问题是求 dp0n, 则底问题是 dn-1n-1

思路:

1)穷举法(递归) 2)记忆化搜索 3)递推

递推求解思路:

1)设计状态:自底向上(画出二叉树) 2)初始状态 3)状态转移方程(数学归纳法)

木川工作室 (微信:mcmc2024)