📜  门| GATE-CS-2001 |第 31 题(1)

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

题目介绍

本题目来源于2001年计算机科学的门考试,是对程序员算法的考察,具有一定的难度。

题目描述

以下是本题的描述:

给定 $n$ 个整数 $a_{1},a_{2}...a_{n}$ ,请为每一个 $i$ 找到 $a_{j}$ 的最大值满足 $j<i$ 且 $a_{j}<a_{i}$ 。如果没有这样的 $j$ ,输出 $-1$ 。

解题思路

该题的解题思路是使用栈结构,通过循环遍历整个数组,维护一个单调递减的栈,当遇到一个元素时,如果栈为空,则无法找到比它小的值,比栈顶元素小则弹出栈顶元素,重复该过程,直到遇到比它小的值或者栈为空,最后入栈当前元素。

入栈的元素对应的栈顶元素就是最近比它小的值。如果没有栈顶元素,则表示没有比它小的值。

以下是该题的解题代码:

def find_previous_maximum(arr):
    stack = []
    result = []
    for i, num in enumerate(arr):
        while len(stack) > 0 and stack[-1][1] < num:
            stack.pop()
        if len(stack) == 0:
            result.append(-1)
        else:
            result.append(stack[-1][0])
        stack.append((i, num))

    return result
总结

该题目的解题思路不算很难,但需要注意细节,如单调递减栈的维护,以及入栈的元素和栈中的元素的对应关系等,需要掌握好程序的实现技巧。