📅  最后修改于: 2023-12-03 15:12:36.580000             🧑  作者: Mango
这是2018年GATE计算机科学的一道题目,题号为CS 2018 Q1。
题目大意为:给定一个长度为N的数组A,唯一满足以下条件的数i称为“门”的位置: A[i]>A[j],其中0≤j<i 且 A[j]>0 或 A[i]>A[j],其中N≥j>i 且 A[j]<0 现在给定数组A,需要找到所有的“门”的位置。要求用较小的时间和空间复杂度解决。
从左向右遍历数组A,维护一个栈stack,存储所有满足A[j]>0的下标j。 如果当前位置i使得A[i]>A[j](j为stack中的一个元素),则更新答案(即将j从stack中弹出即可)。 从右向左遍历数组A,与上面的过程类似。
时间复杂度为O(N),空间复杂度也为O(N)。
def find_gates(A):
n = len(A)
res = []
stack = []
for i in range(n):
while stack and A[i] > A[stack[-1]]:
res.append(stack.pop())
if A[i] > 0:
stack.append(i)
stack = []
for i in reversed(range(n)):
while stack and A[i] > A[stack[-1]]:
res.append(stack.pop())
if A[i] < 0:
stack.append(i)
return sorted(list(set(res)))
该函数的输入是一个列表A,输出是所有的“门”所在的位置的有序序列。 可以在下面尝试一些样例来验证这个函数的正确性。