数组 Array
一般典型的数组是固定长度的数组,即其内存空间是固定的,每个元素也都是相同类型的,比如Java的数组。也有动态数组,比如Python的list,无固定长度,元素可以是任意类型。
栈 Stack
后进先出(LIFO)。栈进出的一端称为top(想象成一叠盘子)。进操作称为push或add,出操作称为delete或pop。
队列 Queue
先进先出(FIFO)。队列进的一端称为end(想象成排队的队尾),出的一端称为front。进操作称为enqueue,出操作称为dequeue。
可以用固定数组模拟队列,只需要多记录首尾的index。更新数组时,除了添加新元素,只需要调整首尾的index。当然整个队列大小有限制。
还能用双栈模拟队列。对,就是你想到的最直觉的形式。虽然挺麻烦,但每个元素最多只会进入/转移/弹出各一次,所以均摊到每个元素,时间复杂度是O(1)。当然这个很奇葩冷门,就和冒泡排序一样只是好玩。
优先队列 Priority Queue
优先队列(priority queue)能保证出来的第一个元素始终是满足某种排序的最大或最小的元素,基本操作包括获取、删除最大元素和添加元素。具体的实现可以是数组或者排序数组,但heap(堆)是最高效的实现。
习题
TODO 题名改成中文
| # | 题名 |
|---|---|
| 977 | Squares of a Sorted Array |
| 1089 | Duplicate Zeros |
| 88 | Merge Sorted Array |
| 27 | Remove Elements |
| 26 | Remove Duplicates from Sorted Array |
| 905 | Sort Array By Parity |
| 1051 | Height Checker |
| 448 | Find All Numbers Disappeared in an Array |