📅  最后修改于: 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
该题目的解题思路不算很难,但需要注意细节,如单调递减栈的维护,以及入栈的元素和栈中的元素的对应关系等,需要掌握好程序的实现技巧。