python - python中的最大堆栈 - 2堆栈解决方案
问题描述
我正在尝试在 python 中构建一个最大堆栈,我不确定我做错了什么。
这是问题>
设计一个最大栈数据结构,支持栈操作,支持查找栈的最大元素。
实现 MaxStack 类:
- MaxStack() 初始化堆栈对象。
- void push(int x) 将元素 x 推入堆栈。
- int pop() 移除栈顶元素并返回。
- int top() 获取栈顶元素而不移除它。
- int peekMax() 检索堆栈中的最大元素而不删除它。
- int popMax() 检索堆栈中的最大元素并将其删除。
- 如果最大元素不止一个,则只删除最上面的一个。
class MaxStack:
def __init__(self):
self.stack = []
self.stack_max = []
def push(self, x: int) -> None:
self.stack.append(x)
if not self.stack_max or x > self.stack_max[-1][0]:
self.stack_max.append([x, 1])
elif x == self.stack_max[-1][0]:
self.stack_max[-1][1] += 1
else:
self.stack_max.append(self.stack_max[-1])
def pop(self) -> int:
if not self.stack_max or self.stack:
return
if self.stack_max[-1][0] == self.stack[-1]:
self.stack_max[-1][1] -= 1
if self.stack_max[-1][1] == 0:
del self.stack_max[-1]
return self.stack.pop()
def top(self) -> int:
return self.stack[-1]
def peekMax(self) -> int:
if self.stack_max:
return self.stack_max[-1][0]
def popMax(self) -> int:
if self.stack_max:
return self.stack_max.pop()[0]
示例代码:
obj = MaxStack()
obj.push(6)
param_2 = obj.pop()
param_3 = obj.top()
param_4 = obj.peekMax()
param_5 = obj.popMax()
输入 :
["MaxStack","push","push","push","top","popMax","top","peekMax","pop","top"] [[],[5],[1],[5],[],[],[],[],[],[]]
输出:
[null,null,null,null,5,5,5,5,None,5]
预期的:
[null,null,null,null,5,5,1,5,1,5]
参考: Leetcode 716. 最大栈
解决方案
对我来说,跟踪值元组中的计数似乎有点令人困惑,当您可以继续添加到最大堆栈并在需要时从列表中计数它们时。
class MaxStack:
def __init__(self):
self.stack = []
self.maxes = []
def push(self, n):
self.stack.append(n)
if not self.maxes or n >= max(self.maxes):
self.maxes.append(n)
def pop(self):
if self.stack:
val = self.stack.pop()
if val in self.maxes:
self.maxes.remove(val)
def top(self):
if self.stack:
return self.stack[-1]
def peek_max(self):
if self.maxes:
return self.maxes[-1]
def pop_max(self):
if self.maxes:
return self.maxes.pop()
然后,如果您需要每个数量的计数,只需使用 count():
def max_count(self):
if self.maxes:
return self.maxes.count(max(self.maxes))
推荐阅读
- reactjs - 运行构建过程时如何配置我的 prod 环境变量?
- android - 升级 GStreamer。预期的 NDK STL 共享对象文件
- java - 以编程方式打开设备密码更改android
- mysql - MySQL中同时插入父子表
- ios - NotificationCenter.default.addObserver 没有调用目标 C 函数
- date - Bigquery - dd mmm yyyy hh:mm 的格式元素语法
- sap-cloud-platform - SAP CP TMS 抛出错误 - “无法获取进程的部署日志消息”
- java - 在春季测试中,如何使用 MockRestServiceServer 仅模拟一个特定的调用?
- assembly - 组装中的堆栈以及如何有效地使用它们
- maple - 如何将枫树表达式转换为python代码?