zoukankan      html  css  js  c++  java
  • [LeetCode] 85. Maximal Rectangle Java

    题目:

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

    For example, given the following matrix:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    

    Return 6.

    题意及分析:就是给一个矩阵,找一个全是一的最大子矩阵。给出一个包含0,1的二维矩阵,要求求出只包含1的最大子矩阵。判断能不能在matrix[i][j]及其坐左上角的点形成一个全是1的矩形:若当前点为0,肯定不可以;若当前点不为0,那么如何求左上角能得到的全是1的最大矩阵,这里可以转化为求直方图的最大面积。

    代码:

    class Solution {
        public int maximalRectangle(char[][] matrix) {      //给出一个包含0,1的二维矩阵,要求求出只包含1的最大子矩阵。判断能不能在matrix[i][j]及其坐左上角的点形成一个全是1的矩形:若当前点为0,肯定不可以;若当前点不为0,
    
            int xLength = matrix.length;
            if(xLength==0) return 0;
            int yLength = matrix[0].length;
    
            int[][]  tempMatrix = new int[xLength][yLength];        //tempMatrix[i][j]代表在在第j列到底i行时连续1的个数
            for(int j=0;j<yLength;j++){
                tempMatrix[0][j] = (matrix[0][j]=='0'?0:1);
            }
            for(int j=0;j<yLength;j++) {
                for(int i=1;i<xLength;i++){
                    if(matrix[i][j]=='0')
                        tempMatrix[i][j] = 0;
                    else{
                        tempMatrix[i][j] = tempMatrix[i-1][j]+1;
                    }
                }
            }
            int max = 0;
            for(int i=0;i<xLength;i++){
                int temp = largestRectangleArea(tempMatrix[i]);
                if(max <temp)
                    max = temp;
            }
            return max;
        }
    
        private int largestRectangleArea(int[] heights) {        //如果已知height数组是升序的,应该怎么做?比如1,2,5,7,8那么就是(1*5) vs. (2*4) vs. (5*3) vs. (7*2) vs. (8*1)也就是max(height[i]*(size-i)),使用栈的目的就是构造这样的升序序列,按照以上方法求解。在构造栈的时候保存可能的最大值
            if(heights == null)
                return 0;
            int tempResult = 0;
            Stack<Integer> stack = new Stack<>();
            stack.push(heights[0]);
            for(int i=1;i<heights.length;i++){
                if(heights[i]>=stack.peek()){        //升序
                    stack.push(heights[i]);
                }else{
                    if(!stack.isEmpty()){
                        int count = 0;
                        int min = stack.peek();
                        while(!stack.isEmpty() && stack.peek()>heights[i]){
                            if(stack.peek()<min){
                                min = stack.peek();
                            }
                            stack.pop();
                            count ++;
                            if(tempResult<count*min){
                                tempResult = count*min;
                            }
                        }
                        int j=0;
                        while(j<=count){
                            stack.push(heights[i]);
                            j++;
                        }
                    }
                }
            }
            for(int i=heights.length-1;i>=0;i--){
                int x= stack.pop();
                if((heights.length-i)*x>tempResult){
                    tempResult =(heights.length-i)*x;
                }
            }
            return tempResult;
        }
    }
  • 相关阅读:
    使用TransactionScope实现多数据库连接事务操作
    zabbix_agentlinux下的安装
    (转)Zabbix AgentWindows平台配置指导
    使用SpringSide 3.1.4.3开发Web项目的全过程(上)
    应用开发中数据字典项设计实现方案
    Oracle Top N 和 Oracle中的limit问题解决方案
    Struts 2.0的codebehinde插件应用简述
    PropertyUtils和MethodUtils使用
    Log4j基本使用方法
    Quartz从入门到进阶
  • 原文地址:https://www.cnblogs.com/271934Liao/p/8047597.html
Copyright © 2011-2022 走看看