python-3.x - Hackerrank 问题在时间限制内不适用于大数据(打印最大元素的堆栈问题)
问题描述
hackerrank 问题陈述是:
您有一个空序列,您将收到查询。每个查询都是以下三种类型之一:
1 - 将元素 x 推入堆栈。
2 - 删除存在于堆栈顶部的元素。
3 - 打印堆栈中的最大元素。
输入格式
输入的第一行包含一个整数。
接下来的每一行都包含一个上面提到的查询。(保证每个查询都是有效的。)
约束:
输出格式
对于每个类型查询,在新行上打印堆栈中的最大元素。
样本输入
10 1 97 2 1 20 2 1 26 1 20 2 3 1 91 3
样本输出
26 91
我的代码:
n=int(input())
class Stack:
def __init__(self):
self.stack1=[]
def push(self,x):
return self.stack1.append(x)
def pop(self):
self.stack1.pop()
return
def maximum(self):
return max(self.stack1)
stack_object=Stack()
for _ in range(n):
a=list(map(int,input().split()))
if a[0]==1:
stack_object.push(a[1])
elif a[0]==2:
stack_object.pop()
else:
print(stack_object.maximum())
使用这种时间复杂度 O(n^2) 的算法,我能够通过 27 个测试用例中的 16 个。
有人可以分享一个更优化的时间复杂度 O(n) 的问题的解决方案。
提前致谢。
解决方案
有一个简单的 O(n) 算法。
与其压栈x
顶,不如简单地压栈max(x, current_top)
。
然后,堆栈的顶部将包含迄今为止推送的所有值的最大值。
推荐阅读
- django - 如何在 Django 模板中管理复选框
- reporting-services - SSRS 2012 日期格式
- c++ - std::span 默认构造函数的当前标准规范在“Extent <= 0”上是否正确?
- c# - Unity 通过网络发送和接收麦克风音频
- ibm-cloud-infrastructure - 我无法使用 sshkey 订购 SUSPEND_CLOUD_SERVER
- angular - *ngIf 仅当它与 firestore 中的数组中的值匹配时
- python - 如何创建一个循环来替换 NaN 值?
- url-rewriting - 如何修复 500.19 "faultRequestLogPath" 失败?
- angular - Angular 应用程序组件在重定向后未加载本地存储值
- c# - IENumerator 每次调用都不会产生 & 随机范围不会重置每次运行