131. 直方图中最大的矩形

摘要
Title: 131. 直方图中最大的矩形
Tag: 单调栈
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

131. 直方图中最大的矩形

  • 题意

    img

  • 思路

    单调栈典型的应用题

    具体思路为,枚举每个高度,找到此高度往左和往右延申的最长长度,两者相乘就是答案

    优化思路就是用单调栈实现的,此高度延申的边界就是比它小的高度,那么就是要找左边第一个小的ll,和右边第一个小的rr,(l,r)便是此高度能延伸的

    注意

    • 为了方便处理边界,两侧边界都为-1,即比最小的高度还小
    • 此次栈存的是下标,所以栈的初始值是0或者n+1
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    '''
    Author: NEFU AB-IN
    Date: 2022-02-27 09:19:29
    FilePath: \ACM\Acwing\131.py
    LastEditTime: 2022-02-27 09:52:36
    '''

    N = int(1e5 + 100)
    h, l, r = [0] * N, [0] * N, [0] * N

    while True:
    try:
    h = list(map(int, input().split()))[1:]
    if not h:
    break
    n = len(h)
    h = [-1, *h, -1]
    # 此次栈存的是下标,比较时换成下标比较即可
    stk = [0]
    for i in range(1, n + 1):
    while stk and h[stk[-1]] >= h[i]:
    stk.pop()
    l[i] = stk[-1] if stk else -1
    stk.append(i)

    stk = [n + 1]

    for i in range(n, -1, -1):
    while stk and h[stk[-1]] >= h[i]:
    stk.pop()
    r[i] = stk[-1] if stk else -1
    stk.append(i)

    res = 0
    for i in range(1, n + 1):
    res = max(res, h[i] * (r[i] - l[i] - 1))
    print(res)
    except:
    break
使用搜索:谷歌必应百度