Data Structure
Array
- 可以利用数组元素的正负性表示存在性(或其他特殊意义)
Array Two Pointers
- 可以在有穷时间内判断是否存在循环: 一个快指针, 一个慢指针, 当两者相遇时, 表示存在循环.
- Slide Window:
window = [lo, hi].
Array Float Pointer
利用浮动指针解决相关问题:
- 字符串比较
- 连续区间问题(尺取法)
List
List Two Pointers
Slow and fast pointer:
- Judge cycle.
- Find middle node.
Stack
Monotonic Stack
单调栈: 寻找下一个更小/更大 (Smaller/Greater) 元素.
const stack: number[] = []
const greaterMap = new Map<number, number>()
for (const num of nums) {
while (stack.length && stack[stack.length - 1] < num)
greaterMap.set(stack.pop() as number, num)
stack.push(num)
}
Map
- 用于 Hash 化
- 用于将字符串转为数字
- 用于计数
Set
- 用于去重与查重 (
Duplicate Problem, e.g. LeetCode 217/219/220). - 用于集合运算题(交、并、差等)
BitMap
Bit presentation: 多用于状态枚举(1 bit 表示 1 个状态/开关), 表示状态集合.
可用于动态规划中压缩状态
0 // empty set
1 << i // just 1 bit on
(1 << n) - 1 // n bit on
if (S >> i & 1) // include nth(i) bit
S | 1 << i // insert nth(i) bit
S & ~(1 << i) // remove nth(1) bit
S | T // union
S & T // intersection
i & -i // last 1 bit