1. Two Sum
1 | class Solution { |
1 | class Solution { |
706. Design HashMap
1 | //设计一个哈希表 |
652. Find Duplicate Subtrees
1 |
如果想用一个遍历序列表示一棵二叉树,那么一定要加上空节点
VLR + LVR 或 LVR + LRV 可以重建一颗二叉树, 如果只给一个序列重建二叉树, 那么这个序列中要包含空节点
例如, 图中二叉树可以表示为
1, 2, 4, #, #, 3, 2, 4, #, #, 4, #, #
这样题目就转化成了类似187题…
哈希的目的是把一个大的空间 映射成一个小的空间
560. Subarray Sum Equals K
前缀和
1 |
[692. Top K Frequent Words] (https://leetcode.com/problems/top-k-frequent-words/)
此题和下面那道题是考察的堆
自己手写的话,可以实现 (任意位置的)
1.查找最大值 o(1)
2.插入一个数 o(logn)
3.删除一个数 o(logn)
4.修改一个数 o(logn)
但是 C++ 的 priority_queue 只能操作堆顶元素
目标 找出出现次数最多的k个单词
用小根堆来维护出现次数最多的k个单词(保证堆中的元素都是最大的), 反之找最少的维护大根堆。
这里用取相反数的方式来形成一个小根堆,而不用priority_queue<PIS, vector
1 | vector<string> topKFrequent(vector<string>& words, int k) { |
295. Find Median from Data Stream
小根堆 n/2
大根堆 n/2
维护一个大根堆, 一个小根堆, 各有 n / 2 个元素; 大根堆中是前一半元素, 小根堆中是后一半元素, (当n为奇数时)我们让上面的元素个数比下面的多一个即可, 这样小根堆的堆顶元素就是中位数。
插入一个元素 x, 当x 大于等于 大根堆的堆顶元素时, 插入到小根堆, 反之插入到小根堆中。
1 | class MedianFinder { |
判断奇数的方式。 num & 1
352. 352. Data Stream as Disjoint Intervals
用平衡树来维护所有区间 (map的遍历是 o(n) 的)map<int, int> L, R; L把所有左端点 映射成 右端点
[1, 2], [4, 7], [9, 9]
L[1] = 2, L[4] = 7, L[9] = 9;
R[2] = 1, R[7] = 4, R[9] = 9;
—————————— x ——————————
x-1 x+1
- 判断x是否已经存在了
- 左右都存在 x 可以 与两边合并
- 左边存在,右边不存在 x 与左边合并
- 左边不存在, 右边存在 x 与右边合并
- 左右都不存在 [x, x] x单独成为一个区间
1 |
547. Friend Circles
并查集
1 | class Solution { |