zoukankan      html  css  js  c++  java
  • 单调栈题目

    1 典型的单调栈问题,利用单调递减栈进行解决,从前和从后遍历都可以解决问题,从后遍历时,确定的是入栈元素的答案,从前遍历时,确定的是出栈元素的答案,

    739. 每日温度

    2 利用单调递减栈解决,关键是出栈时计算每个位置当前可以盛水的量,所以每次出栈后要保证栈不空,才可以计算盛水量,否则结束,

    42. 接雨水

    3 用单调递减栈从前往后遍历,多了一个用哈希表来记录映射,

    496. 下一个更大元素 I

    4 单调递增栈,这个题的关键是求面积的方法,必须要前后加两个哨兵,注意面积的高为height[i]时,其宽必须是当前元素(将要入栈的元素)索引和栈中height[i]的前一个元素的索引的差减1,这里是关键,关键是求宽,栈中记录的是单调栈的索引,如栈是[2,3,6],则说明height[4],height[5],height[6]中height[6]是最小的,所以其宽度为3,而height[3]小于height[6]

    84. 柱状图中最大的矩形

    5 腾讯逛街题,这个题实际上考虑的是单调递减栈中有多少个元素,不论将要入栈的元素是大于栈顶还是小于栈顶,其可以看到的楼的个数都是栈中的元素个数,所以先保存栈的元素个数,再进行压栈出栈操作,

    # 自己的代码,用两个单调递减栈进行处理,一个顺序,一个倒序
    l = int(input())
    data = list(map(int, input().split()))
    # l = 6
    # data = [5,3,8,3,2,5]
    res = [1] * l
    stack = []
    for i in range(l):
        k = len(stack)
        while stack and data[stack[-1]] <= data[i]:
            stack.pop()
        res[i] += k
        stack.append(i)
    stack = []
    for j in range(l-1, -1, -1):
        k = len(stack)
        while stack and data[stack[-1]] <= data[j]:
            stack.pop()
        res[j] += k
        stack.append(j)
    str_res = ' '.join([str(i) for i in res])
    print(str_res)
    # for i in res:
    #     print(i, end=' ')
    View Code

    https://www.nowcoder.com/question/next?pid=21283868&qid=830860&tid=32937832

    递增递减指的是从栈底到栈顶

    求解数组中元素右边第一个比它小的元素的下标,从前往后遍历,构造单调递增栈;
    求解数组中元素右边第一个比它大的元素的下标,从前往后,构造单调递减栈;
    求解数组中元素左边第一个比它小的元素的下标,从后往前,构造单调递减栈;
    求解数组中元素左边第一个比它大的元素的下标,先构造单调递减栈。再从后往前遍历,这个题就是962. 最大宽度坡
    链接:https://leetcode-cn.com/problems/maximum-width-ramp/solution/dan-diao-di-jian-zhan-on-by-
    单调栈中的每个元素都可以看作是坡底(实际上并不一定严格在坡底,有可能在半山腰)的元素

    参考:https://leetcode-cn.com/problems/maximum-width-ramp/solution/dan-diao-zhan-by-user8973/

  • 相关阅读:
    让ASP.NET MVC页面返回不同类型的内容
    在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)
    BrnMall多店版网上商城正式发布
    Brn系列网上商城发布指南
    CSS和SVG中的剪切——clip-path属性和<clipPath>元素
    C#实现调用Java类中方法
    WCF 第五章 会话级别的实例
    细说 ASP.NET Cache 及其高级用法
    C#使用SOAP调用Web Service
    JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12765778.html
Copyright © 2011-2022 走看看