📜  门| GATE CS 2018 |简体中文问题1(1)

📅  最后修改于: 2023-12-03 15:12:36.580000             🧑  作者: Mango

门 | GATE CS 2018 |简体中文问题1

这是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,输出是所有的“门”所在的位置的有序序列。 可以在下面尝试一些样例来验证这个函数的正确性。