NC237 最大矩形

最大矩形

https://www.nowcoder.com/practice/5720efc1bdff4ca3a7dad37ca012cb60

参考的链接

import java.util.*;


public class Solution {
    public int maximalRectangle (int[][] matrix) {
        //调用length获得二维数组的行数n
        //求出二维数组的列数m
        int n=matrix.length;
        int m=matrix[0].length;
        //正向遍历每一行,逆向遍历列,求出每个元素的右边连续1的个数
        for(int i=0;i<n;i++){
            for(int j=m-2;j>=0;j--){
                  matrix[i][j]=matrix[i][j]==0?0:matrix[i][j]+matrix[i][j+1];
            }
        }
        int maxArea=0;
        int j=0;
        //遍历每一列,分别将每一列的不同行作为直方图,求出最大的矩形的面积
        while(j<m){
            int maxheight=0;
            int[] height=new int[n];
            //以每一列的每一行的元素作为直方图的底,求出每个直方图的高度,以及最大的直方图的高度
            for(int i=0;i<n;i++){
                height[i]=matrix[i][j];
                maxheight=Math.max(maxheight,height[i]);
            }
            //如果直方图的最大的高度为0,那么就表示不能形成矩形,直接以后一列的不同行的元素 作为底的直方图所能形成的最大的矩形
            if(maxheight==0){
                j++;
                continue;
            }
            //调用函数求出最大的矩形的面积
            maxArea=Math.max(maxArea,largestRectangleArea(height));
            j++;
        } 
        return maxArea;
    }
    //求出最大的矩形的面积
    private int largestRectangleArea(int[] height){
        //开一个栈
        Stack<Integer> stack=new Stack<>();
        int n=height.length;
        int maxArea=0;
       //遍历每一个高度
       //只要栈不为空并且后面入栈的元素小于栈顶的元素
       //就将栈顶记录的高度作为矩形的高,矩形的右边界就是即将入栈的元素i,矩形的左边界就是l
       //所以矩形的面积就是h*(i-l)
        for(int i=0;i<n;i++){
             while(!stack.empty()&&height[stack.peek()]>height[i]){
                int h=height[stack.pop()];
                int l=stack.empty()?0:stack.peek()+1;
                maxArea=Math.max(maxArea,h*(i-l));
             }
             stack.push(i);
        }
        //对于剩下的元素
        //只要栈不为空,就将栈顶的元素记录的高度作为矩形的高h
        //矩形的右边界就是n,左边界是l,矩形的面积=h*(n-l)
        while(!stack.empty()){
            int h=height[stack.pop()];
            int l=stack.empty()?0:stack.peek()+1;
            maxArea=Math.max(maxArea,h*(n-l));
        }
       return maxArea;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 18:05
哈哈哈哈哈感觉朋友找工作的已经疯掉了,直接上图
码农索隆:真老板娘:“我嘞个去,这不我当年的套路吗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:20
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务