1. 数组和字符串
- 排序序列中寻找元素:使用二分搜索或其变种。
- 例题:在排序数组中查找元素的第一个和最后一个位置 LeetCode 34
- 例题:寻找旋转排序数组中的最小值 LeetCode 153
- 寻找重复元素:使用快慢指针(Floyd 判圈算法)或位运算。
- 例题:寻找重复数 LeetCode 287
- 例题:缺失的第一个正数 LeetCode 41
- 统计元素出现次数:使用哈希表。
- 例题:只出现一次的数字 LeetCode 136
- 例题:字符串中的第一个唯一字符 LeetCode 387
- 字符串模式匹配:使用KMP算法或Rabin-Karp算法。
- 例题:实现strStr() LeetCode 28
- 例题:重复的DNA序列 LeetCode 187
2. 动态规划
- 最优子结构问题:使用动态规划。
- 例题:最大子序和 LeetCode 53
- 例题:爬楼梯 LeetCode 70
- 例题:最长上升子序列 LeetCode 300
- 背包问题:使用0/1背包或完全背包的DP解法。
- 例题:组合总和IV LeetCode 377
- 例题:零钱兑换 LeetCode 322
3. 图和树
- 路径查找问题:使用DFS或BFS。
- 例题:岛屿数量 LeetCode 200
- 例题:课程表 LeetCode 207
- 最短路径问题:使用Dijkstra或Floyd-Warshall算法。
- 例题:网络延迟时间 LeetCode 743
- 例题:最小基因变化 LeetCode 433
- 连通性问题:使用并查集。
- 例题:省份数量 LeetCode 547
- 例题:冗余连接 LeetCode 684
4. 贪心算法
- 最小/最大化问题:使用贪心选择。
- 例题:跳跃游戏 LeetCode 55
- 例题:划分字母区间 LeetCode 763
5. 栈和队列
- 最近相关性问题:使用栈。
- 例题:有效的括号 LeetCode 20
- 例题:每日温度 LeetCode 739
- 滑动窗口问题:使用双端队列。
- 例题:滑动窗口最大值 LeetCode 239
- 例题:最小覆盖子串 LeetCode 76
6. 回溯算法
- 组合问题:使用回溯。
- 例题:组合 LeetCode 77
- 例题:总和 LeetCode 39
- 例题:子集 LeetCode 78
- 排列问题:使用回溯。
- 例题:全排列 LeetCode 46
- 例题:全排列II LeetCode 47
7. 数学问题
- 数论问题:使用素数筛选或欧几里得算法。
- 例题:计数质数 LeetCode 204
- 例题:最大公约数 LeetCode 1979
- 几何问题:使用计算几何中的向量运算。
- 例题:安装栅栏 LeetCode 587
- 例题:直线上最多的点数 LeetCode 149
8. 位操作
- 快速计算问题:使用位运算。
- 例题:只出现一次的数字II LeetCode 137
- 例题:比特位计数 LeetCode 338
9. 其它技巧
- 滑动窗口:用于子数组或子串问题。
- 例题:无重复字符的最长子串 LeetCode 3
- 例题:最小覆盖子串 LeetCode 76
- 前缀和与差分数组:用于区间和查询和动态更新。
- 例题:区域和检索-数组不可变 LeetCode 303
- 例题:区间加法 LeetCode 370