前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >单调栈结构 && 84. Largest Rectangle in Histogram&&最大子矩阵的大小

单调栈结构 && 84. Largest Rectangle in Histogram&&最大子矩阵的大小

原创
作者头像
大学里的混子
修改于 2019-02-25 03:00:17
修改于 2019-02-25 03:00:17
54600
代码可运行
举报
文章被收录于专栏:LeetCodeLeetCode
运行总次数:0
代码可运行

一、

二、 Largest Rectangle in Histogram 直方图的最大的面积

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.

Example:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: [2,1,5,6,2,3]
Output: 10

解法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int largestRectangleArea(int[] heights) {
        if (heights == null || heights.length < 1) return 0;
        //构建一个栈低到栈顶 由小到大的单调栈
        Stack<Integer> stack = new Stack<>();
        int maxArea = 0;
        for(int i = 0; i < heights.length; i++){
            //栈不为空,并且栈顶的元素大于当前的元素时候,弹出栈中的元素
            while (!stack.isEmpty() && heights[i] <= heights[stack.peek()]){
                int j = stack.pop();
                int k = stack.isEmpty()? -1 : stack.peek();
                int curArea = (i - k - 1) * heights[j];
                maxArea = Math.max(maxArea,curArea);
            }
            stack.push(i);
        }
        //当遍历完整个数组,栈不为空,那么需要继续弹出,说明没有比栈顶元素更小的元素了
        while (!stack.isEmpty()){
            int j = stack.pop();
            int k = stack.isEmpty() ? -1 : stack.peek();
            int curArea = (heights.length - k - 1) * heights[j];
            maxArea = Math.max(maxArea,curArea);
        }
        return maxArea;
    }

另外一种采用数组模拟栈的写法,实际上与上面的解法一样,都是单调栈的解法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public int largestRectangleArea(int[] heights) {
    int len = height.length;
        int[] s = new int[len+1];
        int top = 0;
        int maxArea = 0;
        for(int i = 0; i <= len; i++){
            int h = (i == len ? 0 : height[i]);
            while(top != 0&&height[s[top-1]] > h){ 
                int tp = s[top-1];
                top--;
                maxArea = Math.max(maxArea, height[tp] * (top==0 ? i : i - 1 - s[top-1]));
            }
            s[top++] = i;       
        }
        return maxArea;
    }

三、最大子矩阵的大小

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

Example:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
Output: 6

解法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int largestRectangleArea(int[] heights) {
        if (heights == null || heights.length < 1) return 0;
        //构建一个栈低到栈顶 由小到大的单调栈
        Stack<Integer> stack = new Stack<>();
        int maxArea = 0;
        for(int i = 0; i < heights.length; i++){
            //栈不为空,并且栈顶的元素大于当前的元素时候,弹出栈中的元素
            while (!stack.isEmpty() && heights[i] <= heights[stack.peek()]){
                int j = stack.pop();
                int k = stack.isEmpty()? -1 : stack.peek();
                int curArea = (i - k - 1) * heights[j];
                maxArea = Math.max(maxArea,curArea);
            }
            stack.push(i);
        }
        //当遍历完整个数组,栈不为空,那么需要继续弹出,说明没有比栈顶元素更小的元素了
        while (!stack.isEmpty()){
            int j = stack.pop();
            int k = stack.isEmpty() ? -1 : stack.peek();
            int curArea = (heights.length - k - 1) * heights[j];
            maxArea = Math.max(maxArea,curArea);
        }
        return maxArea;
    }

    public int maximalRectangle(char[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0;
        int res = 0;
        int [] bottom = new int[matrix[0].length];

        for (int i = 0 ; i < matrix.length;i++){
            for (int j = 0 ; j < matrix[0].length ;j++)
            bottom[j] = matrix[i][j] == '0' ? 0 :bottom[j] + 1;
            res = Math.max(res,largestRectangleArea(bottom));
        }
        return res;

    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode <Stack>84&85. Maximal Rectangle&Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
大学里的混子
2018/11/20
4350
LeetCode85. 最大矩形
 这是LeetCode84题的一个扩展。这道题做法和84很类似,首先对第一行求一个最大体积,然后到第二行,将第一行的值累加到第二行上,但是有一个前提条件,如果第二行某一列的值是0,那就直接是0了,比方说第二行累加后的值为2,0,2,1,1,然后对这个值求一次最大体积。第三行累加后的值为3,1,3,2,2,第四行累加后的值为4,0,0,3,0
mathor
2018/08/17
1.5K0
LeetCode85. 最大矩形
搞定大厂算法面试之leetcode精讲13.单调栈
搞定大厂算法面试之leetcode精讲13.单调栈 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 239. 滑动窗口最大值 (hard) 方法1.优先队列 动画过大,点击查
全栈潇晨
2021/12/01
8150
二维矩阵中的最大矩形面积–java实现
给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积。
全栈程序员站长
2021/09/29
7860
二维矩阵中的最大矩形面积–java实现
LeetCode84.柱状图中最大的矩形
题目链接:LeetCode84  单调栈板子题,创建一个单调递增栈(栈底到栈顶是递增的),栈内存放的数组下标,遍历数组,将下标存进栈内,以样例来说  首先栈空,0直接进栈;然后因为nums[st
mathor
2018/08/17
3590
LeetCode84.柱状图中最大的矩形
单调栈详解及其LeetCode应用详解
栈(Stack)是一种操作受限的线性表,只允许一端进,同一端出,因而具有后进先出(LIFO)的特性。
Steve Wang
2022/05/10
3.9K0
单调栈详解及其LeetCode应用详解
【甘泉算法】一文搞定单调栈问题
本文主要利用单调栈来解决leetcode上的典型问题,其实它的应用范围倒是不广,主要解决的都是类似于leetcode上下一个更大元素的问题,本文将从这类问题出发,帮助大家掌握单调栈的应用技巧。主要题型如下所示:
itlemon
2022/01/10
8550
【甘泉算法】一文搞定单调栈问题
单调栈简介
栈内元素非递增或者非递减。另一种说法是从栈底到栈顶递增或者递减。在很多情况下,可能会出现相同的数字元素,所以称之为非递增或者非递减栈比递增、递减栈更合适。
全栈程序员站长
2022/11/08
2260
每日三题-接雨水、柱状图中最大的矩形、每日温度
👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型:Hot100题 🌈 每日三题 接雨水 柱状图中最大的矩形 每日温度 接雨水 解法一 暴力(按列求) 获取离当前节点最远左右两边比当前节点值大的值height[l],hright[r] 因为决定装水容量的是矮的所以取height[l],hright[r] 中小的那个减去height[i]就是当前节点可以存放的水,然后遍历 class Solutio
才疏学浅的木子
2022/11/13
2090
每日三题-接雨水、柱状图中最大的矩形、每日温度
算法细节系列(12):破除想当然
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/70820874
用户1147447
2019/05/26
3160
【LEETCODE】模拟面试-84-Largest Rectangle in Histogram
题目: https://leetcode.com/problems/largest-rectangle-in-histogram/ Given n non-negative integers rep
杨熹
2018/04/03
6830
【LEETCODE】模拟面试-84-Largest Rectangle in Histogram
leetcode: 84. Largest Rectangle in Histogram
Problem # Given n non-negative integers representing the histogram's bar height where the width of e
JNingWei
2018/09/27
5760
leetcode: 84. Largest Rectangle in Histogram
LeetCode-84-柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
benym
2022/07/14
2170
单调栈
栈(Stack)是一种操作受限的线性表,只允许一端进,同一端出,因而具有后进先出(LIFO)的特性。
Steve Wang
2020/12/16
7200
单调栈
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
张伦聪zhangluncong
2022/10/26
2250
Leetcode No.84 柱状图中最大的矩形(单调栈)
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
week
2022/01/06
3710
Leetcode No.84 柱状图中最大的矩形(单调栈)
用javascript分类刷leetcode13.单调栈(图文视频讲解)
我们怎样加速嵌套的这层循环呢,其实可以预先计算从左往右和从右往左的最大高度数组,在循环数组的时候,可以直接拿到该位置左右两边的最大高度,当前位置的接水量就是左右两边高度的较小者减去当前位置柱子的高度
js2030code
2023/01/05
6000
JS算法探险之栈(Stack)
今天,我们继续探索JS算法相关的知识点。我们来谈谈关于栈Stack的相关知识点和具体的算法。
前端柒八九
2022/08/25
6370
JS算法探险之栈(Stack)
食堂店小二儿教你学会栈
店小二儿十分勤奋,前台后厨的活儿他都干,每天都要跑前跑后端顾客吃完的盘子。栈就像叠在一起的盘子,客人美滋滋的吃完饭,店小二去收拾桌子捡起盘子时,都是从下往上一个一个的放盘子。而他在后厨橱柜上取盘子给厨师时,是从上往下一个一个依次的取。
童欧巴
2020/09/10
3660
单调栈算法详解_单调栈和单调队列
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
全栈程序员站长
2022/11/08
2720
单调栈算法详解_单调栈和单调队列
相关推荐
LeetCode <Stack>84&85. Maximal Rectangle&Largest Rectangle in Histogram
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档