1. 问题描述:
已知一个int类型数组,,返回一个大小相同的数组,返回的数组的第i个位置的值应当是对于原数组中的第i个元素至少往右走多少步才能遇到一个比自己大的元素。
2. 思路分析:
这道题目是关于单调栈的典型题目,我们只需要在栈中维护一个递减的子序列即可,当发现栈顶元素小于当前遍历的元素的时候说明序列是递增的,这个时候需要弹出栈顶的元素,当前遍历的元素下标减去栈顶元素的下标表示的是栈顶元素的位置到第一个比自己大的步数,一直弹出元素直到栈顶元素大于等于当前遍历的元素位置,这样就可以在弹出当前元素的时候计算出对应的步数
3. 代码如下:
from typing import List
class Solution:
def monostack(self, nums: List[int]):
stack, res = list(), [-1] * len(nums)
# 维护一个递减的子序列
for i in range(len(nums)):
while stack and nums[stack[-1]] < nums[i]:
res[stack[-1]] = i - stack[-1]
stack.pop()
stack.append(i)
return res
if __name__ == '__main__':
print(Solution().monostack([5, 3, 1, 2, 4]))