菜单

问题分类

相关源文件

本页面提供了此仓库中 LeetCode 问题分类的概览,以帮助您高效地进行导航和学习。问题分类对于系统性地学习算法和数据结构、有针对性地进行面试准备以及跟踪您的学习进度至关重要。

分类系统概览

本仓库中的问题按多个维度进行分类,以适应不同的学习方法和应用场景。了解这些分类将有助于您根据当前的重点找到合适的练习题。

来源:README.md98-113 SUMMARY.md49-290

按难度分类

问题分为三个难度级别,通常反映了解决它们所需的算法和概念的复杂性。

简单问题

简单问题侧重于基本概念,通常有直接的解决方案。它们非常适合

  • 学习基本数据结构和算法
  • 建立信心和良好的问题解决习惯
  • 在面试准备期间快速练习

该仓库包含经过精心挑选的简单问题,涵盖了基本概念和常见模式。

Example easy problems:
- Two Sum
- Valid Parentheses
- Maximum Subarray
- Reverse Linked List
- Binary Tree Maximum Depth

来源:collections/easy.md1-49 README.md192-247

中等问题

中等问题是最大的类别,需要更深入的算法思维。它们通常涉及

  • 概念的组合
  • 朴素解法的优化
  • 更复杂的实现细节

中等问题在实际面试中最常见,对面试准备至关重要。

Example medium problems:
- Add Two Numbers
- Longest Substring Without Repeating Characters
- LRU Cache
- Binary Tree Level Order Traversal
- Course Schedule

来源:collections/medium.md1-135 README.md250-453

困难问题

困难问题通常分为几类

  • 复杂的图论问题
  • 高级数据结构设计
  • 博弈论场景
  • 中等问题的进阶,需要进一步优化

困难问题通常需要结合多种算法和广泛的优化技术。

Example hard problems:
- Median of Two Sorted Arrays
- Regular Expression Matching
- Trapping Rain Water
- LFU Cache
- Sliding Window Maximum

来源:collections/hard.md1-64 README.md454-580

按算法类型分类问题

来源:README.md98-105 thinkings/README.md1-36

基本技巧

作为更复杂算法基础的问题解决方法

  • 分治法:将问题分解成更小的子问题,单独解决每个子问题,然后合并结果
  • 二分查找:用于排序数组的有效搜索算法,时间复杂度为 O(log n)
  • 贪心算法:在每个阶段做出局部最优选择以获得全局最优
  • 双指针:使用两个参考指针以 O(n) 的时间复杂度遍历数据(通常是数组)

来源:thinkings/binary-search-1.md thinkings/binary-search-2.md

动态规划

动态规划问题涉及将问题分解为重叠的子问题,并只计算每个子问题一次,存储解决方案以避免重复计算。

常见模式包括:

  • 序列 DP:例如最大子数组和的问题
  • 网格 DP:二维问题,例如不同路径的数量
  • 状态 DP:需要状态跟踪的问题
  • 区间 DP:涉及跨区间最优子结构的问题

来源:thinkings/dynamic-programming.md README.md139

图论与树算法

涉及层次结构或网络状数据的问题

  • 树遍历:中序、前序、后序、层序遍历
  • 图搜索:DFS/BFS 用于连通分量问题
  • 路径查找:Dijkstra、Bellman-Ford、Floyd-Warshall 算法
  • 连通性:用于连通性问题的并查集算法
  • 最小生成树:Kruskal 和 Prim 算法

来源:thinkings/tree.md thinkings/binary-tree-traversal.md thinkings/union-find.md

按数据结构分类问题

数据结构是算法设计和实现的基础。问题通常根据它们使用的主数据结构进行分类。

数组和字符串

数组和字符串问题通常涉及操作和遍历技术

  • 前缀和:高效地计算运行总和,用于范围查询问题
  • 滑动窗口:维护一个元素窗口,时间复杂度为 O(n)
  • 双指针:使用两个索引以 O(n) 的时间复杂度解决数组问题
  • 子数组问题:查找具有特定属性的连续片段

来源:thinkings/prefix.md selected/atMostK.md thinkings/slide-window.md

树和图

涉及层次结构或网络状数据的问题

  • 二叉树操作:遍历、构建、路径查找
  • 二叉搜索树:搜索、插入、删除、验证
  • 图遍历:DFS、BFS、拓扑排序
  • 岛屿问题:二维网格上的连通分量
  • 并查集:不相交集合问题

来源:thinkings/tree.md thinkings/island.md problems/108.convert-sorted-array-to-binary-search-tree.md

特殊数据结构

需要专门数据结构的问题

  • 栈和队列:涉及 LIFO/FIFO 操作、单调栈的问题
  • 哈希表:查找优化问题
  • :优先队列问题、第 k 个元素问题
  • Trie (前缀树):单词词典和前缀问题
  • 单调栈/队列:下一个更大/更小元素问题

来源: thinkings/monotone-stack.md problems/456.132-pattern.md

问题模式和技巧

来源: thinkings/slide-window.md thinkings/prefix.md thinkings/bit.md

滑动窗口模式

滑动窗口技术用于处理与连续子数组或子字符串相关的问题

  • 固定大小窗口:当窗口大小恒定时(例如,查找大小为 k 的子数组的最大和)
  • 可变大小窗口:当窗口大小根据约束条件变化时(例如,和大于 x 的最小子数组)
  • 双指针实现:通常使用两个指针来管理窗口边界

常见问题包括

  • 大小为 k 的最大和子数组
  • 最多包含 k 个不同字符的最长子字符串
  • 最小窗口子字符串

来源: thinkings/slide-window.md problems/1310.xor-queries-of-a-subarray.md

双指针技术

双指针技术使用两个引用来遍历数据

  • 同向指针:两个指针朝同一方向移动(例如,快慢指针)
  • 异向指针:指针从相反的两端开始(例如,盛水最多的容器)
  • 多数组指针:遍历不同数组的指针(例如,合并两个排序数组)

常见问题包括

  • 从排序数组中删除重复项
  • 查找和为目标值的数对
  • 链表检测环

来源: problems/19.removeNthNodeFromEndofList.md

岛屿问题

岛屿问题涉及二维网格上的连通分量

  • 岛屿计数:计算网格中连通的陆地单元格
  • 最大面积:查找最大的连通区域
  • 周长计算:计算岛屿的周长
  • 填充算法:将连通分量更改为不同的值

这些问题通常使用 DFS 或 BFS 来探索连通分量。

来源: thinkings/island.md

高级问题类别

困难算法问题

最具挑战性的问题通常涉及

  • 多算法组合:需要同时应用多种技术
  • 复杂图论问题:网络流、强连通分量等
  • 高级动态规划:带状态压缩的 DP、数位 DP 等
  • 复杂数据结构设计:实现具有特定性能要求的复杂数据结构

应对困难问题的技巧

  • 查看数据约束以确定暴力枚举是否可行
  • 尝试归约到已知问题模式
  • 考虑时间和空间复杂度权衡
  • 使用记忆化来优化递归解决方案

来源: collections/hard.md1-24 problems/975.odd-even-jump.md

系统设计问题

一些问题涉及设计具有特定要求的系统或数据结构

  • LRU/LFU 缓存:实现具有特定淘汰策略的缓存机制
  • 文件系统:设计分层存储系统
  • 任务调度器:实现作业调度算法
  • 数据流问题:高效处理连续数据流

这些问题通常评估算法设计和实现能力。

来源: problems/1261.find-elements-in-a-contaminated-binary-tree.md

公司特定问题集

该存储库根据公司在面试中常问的问题对问题进行分类

  • 像谷歌、亚马逊、微软、Facebook 等公司有特定的问题偏好
  • 某些问题在特定行业或特定职位中更常出现
  • 准备公司特定问题有助于为您的面试做好准备

存储库中公司标签的示例包括阿里巴巴、腾讯、百度、字节跳动和 Airbnb。

来源: README.md32-38 problems/108.convert-sorted-array-to-binary-search-tree.md32-38

使用此存储库进行面试准备

学习计划策略

为有效准备

  1. 从基础开始:先掌握基本数据结构和算法
  2. 按难度循序渐进:从简单题开始,然后是中等题,最后是难题
  3. 关注模式:学习问题模式,而不是死记硬背具体解决方案
  4. 练习公司特定问题:当你以特定公司为目标时
  5. 回顾和重温:定期回顾之前解决过的问题

问题解决思路

该存储库建议了以下解决问题的方法(来自 README.md117-126)

  1. 当面试官提出问题时,首先写下要点
  2. 考虑三个关键方面
    • 代码可读性
    • 时间复杂度
    • 空间复杂度
  3. 遵循系统性的 15 步算法面试方法

来源: README.md157-162 README.md117-126