数组
共 25 条分类条目,8 个题型小节; 每行标注难度、题号、原笔记摘要和 LeetCode 链接。
1. 双指针
5 条类型特点:通常用于处理有序数组或需要原地修改的问题。通过两个指针(同向或相向)协作,将 O(n²) 的暴力解法优化至 O(n)。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 简单 | 删除有序数组中的重复项#26 LeetCode ↗ | 快慢指针,慢指针维护无重复区间 |
| 简单 | 移除元素#27 LeetCode ↗ | 快慢指针,将与目标值相等的元素移除 |
| 简单 | 合并两个有序数组#88 LeetCode ↗ | 从后往前双指针,避免覆盖原数组元素 |
| 中等 | LeetCode ↗ | 左右指针向中间移动,每次移动高度较小的指针 |
| 中等 | LeetCode ↗ | 排序后,固定一个数,再用双指针寻找另外两个数 |
- 简单#26
快慢指针,慢指针维护无重复区间
- 简单#27
快慢指针,将与目标值相等的元素移除
- 简单#88
从后往前双指针,避免覆盖原数组元素
- 中等#11站内精讲
左右指针向中间移动,每次移动高度较小的指针
- 中等#15站内精讲
排序后,固定一个数,再用双指针寻找另外两个数
2. 滑动窗口
2 条类型特点:用于寻找满足特定条件的连续子数组,如“最长子数组”、“最小子数组”。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 长度最小的子数组#209 LeetCode ↗ | 窗口和小于目标时右移右指针,大于等于时尝试左移左指针 |
| 中等 | LeetCode ↗ | 用哈希记录窗口内字符,右指针移动时发现重复则左指针收缩 |
- 中等#209
窗口和小于目标时右移右指针,大于等于时尝试左移左指针
- 中等#3站内精讲
用哈希记录窗口内字符,右指针移动时发现重复则左指针收缩
3. 前缀和 & 哈希表优化
2 条类型特点:频繁需要计算子数组的和或统计满足特定和条件的子数组个数。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 和为 K 的子数组#560 LeetCode ↗ | 计算前缀和,用哈希表存储前缀和出现的次数,查找 当前前缀和 - k 的次数 |
| 中等 | 除自身以外数组的乘积#238 LeetCode ↗ | 用前缀积和后缀积(或两次遍历),当前位置结果 = 左边乘积 * 右边乘积 |
- 中等#560
计算前缀和,用哈希表存储前缀和出现的次数,查找 当前前缀和 - k 的次数
- 中等#238
用前缀积和后缀积(或两次遍历),当前位置结果 = 左边乘积 * 右边乘积
4. 二分查找
4 条类型特点:数组通常是有序的,或者题目要求时间复杂度为 O(log n)。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 简单 | 搜索插入位置#35 LeetCode ↗ | 标准二分查找,寻找第一个大于等于目标值的下标 |
| 中等 | LeetCode ↗ | 两次二分查找,分别寻找左边界和右边界 |
| 中等 | 搜索旋转排序数组#33 LeetCode ↗ | 先判断哪一部分有序,再根据目标值决定搜索哪一半 |
| 困难 | LeetCode ↗ | 在两个有序数组中用二分法找到一条分割线,使左右两部分元素个数相等且满足大小关系 |
- 简单#35
标准二分查找,寻找第一个大于等于目标值的下标
- 中等#34
两次二分查找,分别寻找左边界和右边界
- 中等#33
先判断哪一部分有序,再根据目标值决定搜索哪一半
- 困难#4
在两个有序数组中用二分法找到一条分割线,使左右两部分元素个数相等且满足大小关系
5. 贪心算法
2 条类型特点:求最值问题,且局部最优解可以推导出全局最优解。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 跳跃游戏#55 LeetCode ↗ | 维护当前能到达的最远距离,判断是否能走到终点 |
| 中等 | 加油站#134 LeetCode ↗ | 如果总油量大于等于总消耗,则从某个点出发一定能成功。从起始点累加剩余油量,若小于0则更新起始点 |
- 中等#55
维护当前能到达的最远距离,判断是否能走到终点
- 中等#134
如果总油量大于等于总消耗,则从某个点出发一定能成功。从起始点累加剩余油量,若小于0则更新起始点
6. 动态规划
4 条类型特点:求最值、方案数或可行性问题,且问题可以被分解为重叠的子问题。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 简单 | LeetCode ↗ | dp[i] = dp[i-1] + dp[i-2] |
| 中等 | LeetCode ↗ | dp[i] 表示以 i 结尾的连续子数组最大和,状态转移为 max(dp[i-1]+nums[i], nums[i]) |
| 中等 | 不同路径#62 LeetCode ↗ | 二维DP,dp[i][j] = dp[i-1][j] + dp[i][j-1] |
| 中等 | 打家劫舍#198 LeetCode ↗ | dp[i] 表示偷到第 i 家时的最大金额,考虑偷或不偷当前这家 |
- 简单#70站内精讲
dp[i] = dp[i-1] + dp[i-2]
- 中等#53站内精讲
dp[i] 表示以 i 结尾的连续子数组最大和,状态转移为 max(dp[i-1]+nums[i], nums[i])
- 中等#62
二维DP,dp[i][j] = dp[i-1][j] + dp[i][j-1]
- 中等#198
dp[i] 表示偷到第 i 家时的最大金额,考虑偷或不偷当前这家
7. 矩阵操作
3 条类型特点:将一维数组的概念扩展到二维矩阵,考察坐标变换和模拟能力。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 螺旋矩阵#54 LeetCode ↗ | 按层(上、右、下、左)模拟遍历,注意边界条件 |
| 中等 | 旋转图像#48 LeetCode ↗ | 先按对角线翻转,再按行翻转 |
| 中等 | 矩阵置零#73 LeetCode ↗ | 用第一行和第一列作为标记位,原地修改 |
- 中等#54
按层(上、右、下、左)模拟遍历,注意边界条件
- 中等#48
先按对角线翻转,再按行翻转
- 中等#73
用第一行和第一列作为标记位,原地修改
8. 进阶技巧
3 条类型特点:通常为困难题,需要用到特殊的数据结构或算法思想,是对前面基础知识的综合运用。
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 困难 | 接雨水#42 LeetCode ↗ | 方法多样:动态规划(找左右最大值)、双指针、单调栈 |
| 困难 | 数组中的逆序对#51 LeetCode ↗ | 归并排序的分治思想,在合并过程中统计 |
| 困难 | 寻找重复数#287 LeetCode ↗ | 将数组视为链表,用快慢指针找环入口;或用二分法按值搜索 |
- 困难#42
方法多样:动态规划(找左右最大值)、双指针、单调栈
- 困难#51
归并排序的分治思想,在合并过程中统计
- 困难#287
将数组视为链表,用快慢指针找环入口;或用二分法按值搜索