目录
不论是代码笔试,还是代码层面的技术面试,其核心无非是:数据结构和算法。
在我的理解中,数据结构像是工具箱里的各种工具,而算法则是解决问题的流程。完成任务的效率和准确性取决于程序员选择使用的工具(数据结构)。
因此,在总结常见算法之前,我们需要先熟悉这些工具🔧。选对工具,才能顺利高效地完成特定任务。
在准备笔试/面试的学习过程中(也是 CS 入门课程的基础),我总结了七类常见的数据结构:
- Arrays
- Stacks
- Queues
- Linked Lists
- Trees
- Graphs
- Hash Tables
基本上,对于 SDE 入门级别的笔试/面试,这七种数据结构已足够覆盖。
以下是我对这些数据结构的特性和常见使用场景的总结,同时附上相关的 Leetcode 题目。这些题目大多来自 Neetcode 150 和 Blind 75。
Arrays
首先是 Arrays,这是编程入门时最基础的数据结构,同时也是最常使用的数据结构。 可以将 Arrays 理解为编程中的基础存储工具。在 Java 中,数组在初始化后,其数据类型和长度是固定的,不能更改。
Stacks
Stack 是一种线性数据结构(即数据遵循线性/顺序存储原则)。Stack 的特性是后进先出(LIFO)。
Monotonic Stack
Monotonic Stack(单调栈)是 Stack 的特性下的一种特定状态,主要分为两种:
- Monotonic Increasing Stack:栈内元素从小到大排列。
- Monotonic Decreasing Stack:栈内元素从大到小排列。
根据 Geeks for Geeks 的定义,Monotonic Stack 是一种用于辅助解决算法问题的特殊数据结构,我个人比较认可这个定义。 此外,还有两种变种:
- Monotonic Non-Increasing Stack(伪单调递减栈)
- Monotonic Non-Decreasing Stack(伪单调递增栈)
它们的区别在于,伪单调栈允许相等元素存在,而不是严格递增或递减。更多细节参考 Leetcode 论坛:Comprehensive Guide on Monotonic Stack
Leetcode 相应题目:
- Valid Parentheses
- Daily Temperatures (Monotonic Increasing Stack)
- Min Stack
- Largeest Rectangle in Histogram
Stack 的操作及时间复杂度
| 操作 | 说明 | 时间复杂度 |
|---|---|---|
pop() | 移除栈顶元素 | O(1) |
push() | 向栈中加入元素 | O(1) |
peek() | 返回栈顶元素 | O(1) |
Queues
(待补充)
Linked Lists
(待补充)
Trees
(待补充)
Graphs
(待补充)
Hash Tables
(待补充)