单调栈解决Next Greater问题

博客围绕Next Greater问题展开,即寻找数组中每个元素之后的最大元素,不存在则用 -1 代替。采用单调栈解决,栈中元素从栈顶到栈底递减或不变。介绍了实现方法,包括准备工作和具体实现步骤,还给出 Leetcode496 和 Leetcode739 两道相关练习题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

Next Greater问题:即为下一个最大元素的问题
给定一个数组nums=[2, 3, 1, 5, 6, 4],寻找数组中每一个元素之后的最大元素,如果该元素不存在,则用-1进行代替

解决方法

基本思想:使用单调栈进行解决,栈中的元素总是从栈顶到栈底递减或不变,因此,每一次遍历结束后,栈顶元素一定是较大的。

实现方法

准备工作

  1. 定义一个空类,继承异常类,用于错误抛出
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
@ModuleName: Empty
@Function: 定义一个空类
@Author: PengKai
@Time: 2020/11/17 21:15
"""


class Empty(Exception):
    pass
  1. 定义一个ArrayStack类,用列表实现一个栈
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
@ModuleName: Stack
@Function: 基于列表实现一个栈
@Author: PengKai
@Time: 2020/11/17 21:11
"""

import Empty


class ArrayStack:

    def __init__(self):
        """
        初始化栈为一个列表
        """
        self._data = []

    def __len__(self):
        """
        实现计算栈的长度的方法
        """
        return len(self._data)

    def is_empty(self):
        """
        判断栈是否为空
        """
        return len(self._data) == 0

    def push(self, e):
        """
        元素入栈
        """
        self._data.append(e)

    def top(self):
        """
        获取栈顶元素
        """
        if self.is_empty():
            raise Empty.Empty('Stack is empty')
        return self._data[-1]

    def pop(self):
        """
        元素出栈
        """
        if self.is_empty():
            raise Empty.Empty('Stack is empty')
        return self._data.pop()

具体实现

  1. 初始化一个栈,用于进行元素查找;初始化一个数组ans,数组中存储长度为nums长的元素,元素的值均为-1
  2. 遍历整个数组,如果栈为空且栈顶元素小于当前数组中的值,则栈顶元素出栈且修改数组ans中对应位置的值
  3. 将新的数组值的下标值入栈

具体实现代码如下图所示

from Stack import ArrayStack


def solution(nums):
    n = len(nums)
    ans = [-1] * n
    stack = ArrayStack()
    for i in range(n):
        num = nums[i]
        while not stack.is_empty() and nums[stack.top()] < num:
            t_index = stack.pop()
            ans[t_index] = num
        stack.push(i)
    return ans


if __name__ == '__main__':
    nums = [2, 3, 1, 5, 6, 4]
    ans = solution(nums)
    print(ans)

练习

第一题 Leetcode496-下一个更大元素

题目描述

在这里插入图片描述

解决方法
class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        ans, stack = [], []
        map_nums = {}
        for num in nums2:
            while stack and stack[-1] < num:
                top = stack.pop()
                map_nums[top] = num
            stack.append(num)
        for num in nums1:
            if num in map_nums:
                ans.append(map_nums[num])
            else:
                ans.append(-1)
        return ans

第二题 Leetcode739-每日温度

题目描述

在这里插入图片描述

解决方法
class Solution:
    def dailyTemperatures(self, T: List[int]) -> List[int]:
        n = len(T)
        ans, stack = [0] * n, []
        for i in range(n):
            t = T[i]
            while stack and T[stack[-1]] < t:
                t_index = stack.pop()
                ans[t_index] = i - t_index
            stack.append(i)
        return ans
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值