Skip to content

Commit d4a5417

Browse files
authored
Create Inverview-59.md
1 parent 05a7064 commit d4a5417

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

Algorithm/Inverview-59.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
## Inverview59-2:队列的最大值
2+
3+
**题目**:请定义一个队列并实现函数 max 得到队列里的最大值,要求函数 max、push_back 和 pop_front 的时间复杂度都是 O(1)。也就是对以下函数进行填充并满足要求。
4+
5+
```python
6+
class MaxQueue:
7+
8+
def __init__(self):
9+
10+
11+
def max_value(self) -> int:
12+
13+
14+
def push_back(self, value: int) -> None:
15+
16+
17+
def pop_front(self) -> int:
18+
```
19+
20+
例如输入,第一个列表表示调用函数的顺序,第二列表示调用函数时所带的参数:
21+
22+
```
23+
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
24+
[[],[1],[2],[],[],[]]
25+
```
26+
27+
输出为:
28+
29+
```
30+
[null,null,null,2,1,2]
31+
```
32+
33+
34+
35+
**解题思路**
36+
37+
- 定义两个队列,A 队列存放的是输入的队列,B 队列存放的是可能的最大值队列。
38+
- 例如输入 [2,3,1,2,6,2,5,1] 队列,首先先输入个 2,那么 A 队列里就有 2,B 队列里也是2。
39+
- 然后是输入 3,A 队列就有 [2,3],B 队列里的 2 比 3 小,所以就要把 B 队列清空并赋值 3。
40+
- 接下来输入 1,A = [2,3,1],B队列就要考虑了,因为 1 比 3 小,说明当 A 队列里的 3 出队列之后,后面的 1 有可能是最大值,所以我们要把 1 加入到 B 队列里,接下来依次进行,会发现 B 队列永远都是按照从大到小排序好的。
41+
- 所以,当我们需要 pop_front A队列的时候,就需要比较 A 队列里的第一个元素和 B 队列里的第一个元素,如果相等,删除 B 队列里的头部元素。
42+
43+
**以下代码可提交至LeetCode:**
44+
45+
[https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/](https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/)
46+
47+
```python
48+
class MaxQueue:
49+
50+
def __init__(self):
51+
self.queue = [] # 输入队列
52+
self.max_queue = [] # 可能最大值队列
53+
54+
def max_value(self) -> int:
55+
if len(self.queue) == 0:
56+
return -1
57+
return self.max_queue[0]
58+
59+
def push_back(self, value: int) -> None:
60+
self.queue.append(value)
61+
62+
## 判断是否要删除 最大值 队列
63+
if len(self.max_queue) == 0:
64+
self.max_queue.append(value)
65+
else:
66+
while len(self.max_queue) != 0 and self.max_queue[-1] < value:
67+
self.max_queue.pop()
68+
self.max_queue.append(value)
69+
70+
return None
71+
72+
def pop_front(self) -> int:
73+
if len(self.queue) == 0:
74+
return -1
75+
76+
queue_front = self.queue[0]
77+
78+
## 判断头部元素是否相等
79+
if queue_front == self.max_queue[0]:
80+
del self.max_queue[0]
81+
82+
del self.queue[0]
83+
return queue_front
84+
85+
# 以下是调用函数
86+
input_behavior = ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
87+
input_num = [[],[1],[2],[],[],[]]
88+
result = []
89+
90+
for i, behavior in enumerate(input_behavior):
91+
92+
if behavior == 'MaxQueue':
93+
maxQueue = MaxQueue()
94+
result.append(None)
95+
96+
if behavior == 'push_back':
97+
result.append(maxQueue.push_back(input_num[i][0]))
98+
99+
if behavior == 'max_value':
100+
result.append(maxQueue.max_value())
101+
102+
if behavior == 'pop_front':
103+
result.append(maxQueue.pop_front())
104+
105+
print(result)
106+
```
107+
108+
结果如下:
109+
110+
```
111+
[None, None, None, 2, 1, 2]
112+
```
113+
114+
115+
116+
![](https://gitee.com/kkweishe/images1/raw/master/ML/2020-2-14_10-42-38.png)

0 commit comments

Comments
 (0)