leetcode做题笔记84柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

思路一:单调栈

cpp 复制代码
int largestRectangleArea(int* heights, int heightsSize){
    int top = -1;
    int area, i;
    int maxarea = 0;
    int *stack = (int *)malloc(sizeof(int) * (heightsSize + 2));
    int *buff = (int *)malloc(sizeof(int) * (heightsSize + 2));

    buff[0] = 0;
    for (int i = 1; i <= heightsSize; i++) {
        buff[i] = heights[i - 1];
    }
    buff[heightsSize + 1] = 0;

    stack[++top] = 0;
    for (i = 1; i < heightsSize + 2; i++) {
        while (top > 0 && buff[i] < buff[stack[top]]) {
            area = (i - stack[top - 1] - 1) * buff[stack[top]];
            maxarea = maxarea > area ? maxarea : area;
            top--;
        }
        stack[++top] = i;
    }
    return maxarea;
}

分析:

本题利用单调栈的特性,有两种做法,一是直接从中间数向左右进行递归,判断是否单调递增或递减计算答案,第二种是多加一个空间,从最左边或最右边判断是否为单调递增或递减,此做法多设置了一个空间,利用单调栈向左单调递减的特性找最小值计算矩形的最大值,最后输出答案。

总结:

本题考察单调栈相关知识,利用单调递减递归找到最小值计算矩形大小,最后返回最大值

相关推荐
断剑zou天涯1 小时前
【算法笔记】窗口内最大值或最小值的更新结构
java·笔记·算法
smj2302_796826521 小时前
解决leetcode第3753题范围内总波动值II
python·算法·leetcode
Naiva2 小时前
【小技巧】Microchip 把 MPLAB X IDE工程编码改成 UTF-8
笔记
骑着猪去兜风.3 小时前
线段树(二)
数据结构·算法
fengfuyao9854 小时前
竞争性自适应重加权算法(CARS)的MATLAB实现
算法
散峰而望4 小时前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
leoufung4 小时前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
wyhwust5 小时前
交换排序法&冒泡排序法& 选择排序法&插入排序的算法步骤
数据结构·算法·排序算法
利刃大大5 小时前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
wyhwust6 小时前
数组----插入一个数到有序数列中
java·数据结构·算法