📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 39(1)

📅  最后修改于: 2023-12-03 14:50:48.575000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2020 |问题 39

题目描述: 给出一个长度为n的数组a[]。对于每个位置i(0 <= i < n),输出找到比a[i]大的第一个数字的距离(实际位置)和比a[i]小的第一个数字的距离。如果不存在这样的数字,输出-1。

输入格式
  • 第一行包含一个整数n,表示数组的长度
  • 第二行包含n个整数a[0], a[1], …, a[n−1],表示整个数组。
输出格式

对于数组中的每个位置,输出两个整数—— 左边和右边的距离,如果不存在更大/更小的数字,则输出-1。数字之间用", "分隔,每个输出放在一行上。

样例输入
5
5 6 2 3 4
样例输出
1, 0
2, 1
-1, 1
1, 1
2, -1
代码片段
n = int(input())
a = list(map(int, input().split()))


def next_larger(right=True):
    stack = []
    ans = [-1] * n

    for k in range(n) if right else reversed(range(n)):
        while stack and a[stack[-1]] > a[k]:
            x = stack.pop()
            ans[x] = k - x
        stack.append(k)

    return ans if right else ans[::-1]


nxt_l = next_larger()
nxt_r = next_larger(right=False)

for i in range(n):
    print(f'{nxt_l[i]}, {nxt_r[i]}')
代码说明
  • 通过解析输入的长度和数组获取输入;
  • 编写一个函数来查找当前元素右侧的第一个最大元素(如果right=True),或左侧的第一个最大元素(如果right=False);
  • 对于每个元素调用next_larger函数,以获取其右侧的第一个最大元素的距离,或调用next_larger函数(以right=False),以获取其左侧的第一个最大元素的距离;
  • 输出距离