|
| 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 | + |
0 commit comments