Skip to content

Commit 8f6b669

Browse files
author
lucifer
committed
feat: 设计题
1 parent d8aa3c8 commit 8f6b669

File tree

3 files changed

+144
-5
lines changed

3 files changed

+144
-5
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,12 @@ leetcode 题解,记录自己的 leetcode 解题之路。
253253

254254
- [0004.median-of-two-sorted-array](./problems/4.median-of-two-sorted-array.md)
255255
- [0023.merge-k-sorted-lists](./problems/23.merge-k-sorted-lists.md)
256-
- [0025.reverse-nodes-in-k-group](./problems/25.reverse-nodes-in-k-groups-cn.md) 🆕
256+
- [0025.reverse-nodes-in-k-group](./problems/25.reverse-nodes-in-k-groups-cn.md)
257257
- [0030.substring-with-concatenation-of-all-words](./problems/30.substring-with-concatenation-of-all-words.md)
258258
- [0032.longest-valid-parentheses](./problems/32.longest-valid-parentheses.md)
259259
- [0042.trapping-rain-water](./problems/42.trapping-rain-water.md)
260260
- [0084.largest-rectangle-in-histogram](./problems/84.largest-rectangle-in-histogram.md) 🆕
261-
- [0085.maximal-rectangle](./problems/85.maximal-rectangle.md) 🆕
261+
- [0085.maximal-rectangle](./problems/85.maximal-rectangle.md)
262262
- [0124.binary-tree-maximum-path-sum](./problems/124.binary-tree-maximum-path-sum.md)
263263
- [0128.longest-consecutive-sequence](./problems/128.longest-consecutive-sequence.md)
264264
- [0145.binary-tree-postorder-traversal](./problems/145.binary-tree-postorder-traversal.md)
@@ -267,9 +267,10 @@ leetcode 题解,记录自己的 leetcode 解题之路。
267267
- [0295.find-median-from-data-stream](./problems/295.find-median-from-data-stream.md) 🆕
268268
- [0301.remove-invalid-parentheses](./problems/301.remove-invalid-parentheses.md)
269269
- [0335.self-crossPing](./problems/335.self-crossing.md) 🆕
270-
- [0460.lfu-cache](./problems/460.lfu-cache.md) 🆕
270+
- [0460.lfu-cache](./problems/460.lfu-cache.md)
271271
- [0472.concatenated-words](./problems/472.concatenated-words.md) 🆕
272272
- [0493.reverse-pairs](./problems/493.reverse-pairs.md) 🆕
273+
- [0895.maximum-frequency-stack](./problems/895.maximum-frequency-stack.md) 🆕
273274
- [1168.optimize-water-distribution-in-a-village](./problems/1168.optimize-water-distribution-in-a-village-cn.md) 🆕
274275

275276
### 数据结构与算法的总结
@@ -288,6 +289,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
288289
- [《深度优先遍历》专题](./thinkings/DFS.md) 🆕
289290
- [滑动窗口(思路 + 模板)](./thinkings/slide-window.md) 🆕
290291
- [位运算](./thinkings/bit.md) 🆕
292+
- [设计题](./thinkings/design.md) 🆕
291293

292294
### anki 卡片
293295

@@ -339,8 +341,6 @@ anki - 文件 - 导入 - 下拉格式选择“打包的 anki 集合”,然后
339341

340342
- 单调栈
341343

342-
- 设计题
343-
344344
## 关注我
345345

346346
我重新整理了下自己的公众号,并且我还给它换了一个名字`脑洞前端`,它是一个帮助你打开大前端新世界大门的钥匙 🔑,在这里你可以听到新奇的观点,看到一些技术尝新,还会收到系统性总结和思考。
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
## 题目地址(895. 最大频率栈)
2+
3+
https://leetcode-cn.com/problems/maximum-frequency-stack/
4+
5+
## 题目描述
6+
7+
```
8+
实现 FreqStack,模拟类似栈的数据结构的操作的一个类。
9+
10+
FreqStack 有两个函数:
11+
12+
push(int x),将整数 x 推入栈中。
13+
pop(),它移除并返回栈中出现最频繁的元素。
14+
如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。
15+
 
16+
17+
示例:
18+
19+
输入:
20+
["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"],
21+
[[],[5],[7],[5],[7],[4],[5],[],[],[],[]]
22+
输出:[null,null,null,null,null,null,null,5,7,5,4]
23+
解释:
24+
执行六次 .push 操作后,栈自底向上为 [5,7,5,7,4,5]。然后:
25+
26+
pop() -> 返回 5,因为 5 是出现频率最高的。
27+
栈变成 [5,7,5,7,4]。
28+
29+
pop() -> 返回 7,因为 5 和 7 都是频率最高的,但 7 最接近栈顶。
30+
栈变成 [5,7,5,4]。
31+
32+
pop() -> 返回 5 。
33+
栈变成 [5,7,4]。
34+
35+
pop() -> 返回 4 。
36+
栈变成 [5,7]。
37+
 
38+
39+
提示:
40+
41+
对 FreqStack.push(int x) 的调用中 0 <= x <= 10^9。
42+
如果栈的元素数目为零,则保证不会调用  FreqStack.pop()。
43+
单个测试样例中,对 FreqStack.push 的总调用次数不会超过 10000。
44+
单个测试样例中,对 FreqStack.pop 的总调用次数不会超过 10000。
45+
所有测试样例中,对 FreqStack.push 和 FreqStack.pop 的总调用次数不会超过 150000。
46+
47+
```
48+
49+
## 思路
50+
51+
我们以题目给的例子来讲解。
52+
53+
- 使用fraq 来存储对应的数字出现次数。key 是数组,value频率
54+
55+
![](https://tva1.sinaimg.cn/large/00831rSTly1gda26lkj3aj30d00la76l.jpg)
56+
57+
- 由于题目限制“如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。”,我们考虑使用栈来维护一个频率表 fraq_stack。key是频率,value是数字组成的栈。
58+
59+
![](https://tva1.sinaimg.cn/large/00831rSTly1gda28hw3gaj30k20i8n10.jpg)
60+
61+
- 同时用max_fraq 记录当前的最大频率值。
62+
63+
- 第一次pop的时候,我们最大的频率是3。由fraq_stack 知道我们需要pop掉5。
64+
65+
![](https://tva1.sinaimg.cn/large/00831rSTly1gda2aojd9pj31160nadmq.jpg)
66+
67+
- 之后pop依次是这样的(红色数字表示顺序)
68+
69+
![](https://tva1.sinaimg.cn/large/00831rSTly1gda2ci160nj30pk0ki42y.jpg)
70+
71+
## 关键点解析
72+
73+
- 栈的基本性质
74+
- hashtable的基本性质
75+
- push和pop的时候同时更新fraq,max_fraq 和 fraq_stack。
76+
77+
## 代码
78+
79+
```python
80+
class FreqStack:
81+
82+
def __init__(self):
83+
self.fraq = collections.defaultdict(lambda: 0)
84+
self.fraq_stack = collections.defaultdict(list)
85+
self.max_fraq = 0
86+
87+
def push(self, x: int) -> None:
88+
self.fraq[x] += 1
89+
if self.fraq[x] > self.max_fraq:
90+
self.max_fraq = self.fraq[x]
91+
self.fraq_stack[self.fraq[x]].append(x)
92+
93+
def pop(self) -> int:
94+
ans = self.fraq_stack[self.max_fraq].pop()
95+
self.fraq[ans] -= 1
96+
if not self.fraq_stack[self.max_fraq]:
97+
self.max_fraq -= 1
98+
return ans
99+
100+
# Your FreqStack object will be instantiated and called as such:
101+
# obj = FreqStack()
102+
# obj.push(x)
103+
# param_2 = obj.pop()
104+
```
105+
106+
***复杂度分析***
107+
- 时间复杂度:push 和 pop 平均时间复杂度是 $O(1)$
108+
- 空间复杂度:$O(N)$,其中N为数字的总数。
109+
110+
大家也可以关注我的公众号《脑洞前端》获取更多更新鲜的LeetCode题解
111+
112+
![](https://pic.leetcode-cn.com/89ef69abbf02a2957838499a96ce3fbb26830aae52e3ab90392e328c2670cddc-file_1581478989502)
113+
114+

thinkings/design.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 设计题
2+
3+
系统设计是一个没有标准答案的open-end问题,所以关键在于对于特定问题的设计选择,俗称trade-off。这也是较能考察面试者知识水平的一种题型。
4+
5+
截止目前(2020-03-28),[设计题](https://leetcode-cn.com/tag/design/)在LeetCode一共58道题目。
6+
7+
其中:
8+
9+
- 简单14道
10+
- 中等32道
11+
- 困难12道
12+
13+
这里精选6到题目进行详细讲解,旨在大家能够对系统设计题的答题技巧和套路有所掌握,喜欢的话别忘了点赞和关注哦。
14+
15+
16+
## 题目列表
17+
18+
这是我近期总结的几设计题目,后续会持续更新~
19+
20+
- [0155.min-stack](./problems/155.min-stack.md) 简单
21+
- [0211.add-and-search-word-data-structure-design](../problems/211.add-and-search-word-data-structure-design.md) 中等
22+
- [0232.implement-queue-using-stacks](./problems/232.implement-queue-using-stacks.md) 简单
23+
- [0460.lfu-cache](../problems/460.lfu-cache.md) 困难
24+
- [895.maximum-frequency-stack](../problems/895.maximum-frequency-stack.md) 困难
25+
- [900.rle-iterator](../problems/900.rle-iterator.md) 中等

0 commit comments

Comments
 (0)