zoukankan      html  css  js  c++  java
  • Maximal Rectangle

    地址:https://oj.leetcode.com/problems/maximal-rectangle/

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

    首先吐槽下这个题目,不知道是我英语理解还是题目本身存在让人误解地方,我理解题意是最大的矩形包含全部1元素,按着这个理解我非常开心的写了例如以下代码:代码思路非常easy,类似杨氏矩阵中用到的思想:http://blog.csdn.net/huruzun/article/details/28420545

    public class Solution {
            private char[][] matrix ;
    	public int maximalRectangle(char[][] matrix) {
    		if(matrix.length == 0){
    			return 0;
    		}
    		int row = matrix.length;
    		int col = matrix[0].length;
    		int ans = 0;
    		this.matrix = matrix;
    		Point start = new Point();
    		Point end = new Point(row-1,col-1);
    		while(true){
    			if(isAllZeroDown(start, row)){
    				start.y = start.y+1 >=col ? col-1:start.y+1;
    				if(start.equals(end)){
    					return 0;
    				}
    			}
    			if(isAllZeroLeft(start, col)){
    				start.x = start.x+1 >=row ? row-1:start.x+1;
    				if(start.equals(end)){
    					return 0;
    				}
    			}
    			
    			if(!isAllZeroDown(start, row) && !isAllZeroLeft(start, col)){
    				break;
    			}
    		}
    		
    		while(true){
    			if(isAllZeroRight(end)){
    				end.y = end.y-1>= 0 ? end.y-1:0;
    			}
    			if(isAllZeroUp(end)){
    				end.x = end.x-1>= 0 ? end.x-1:0;
    			}
    			if(!isAllZeroRight(end) && !isAllZeroUp(end)){
    				break;
    			}
    		}
    		ans = Math.abs((end.x-start.x+1)*(end.y - start.y+1));
    		return ans;
    	}
    	
    	boolean isAllZeroDown(Point p,int len){
    		int j = p.y;
    		for(int i=p.x;i<len;i++){
    			if(matrix[i][j]=='1'){
    				return false;
    			}
    		}
    		return true;
    	}
    	boolean isAllZeroLeft(Point p,int len){
    		int i = p.x;
    		for(int j=p.y;j<len;j++){
    			if(matrix[i][j]=='1'){
    				return false;
    			}
    		}
    		return true;
    	}
    	boolean isAllZeroUp(Point p){
    		int i = p.x;
    		for(int j=p.y;j>=0;j--){
    			if(matrix[i][j]=='1'){
    				return false;
    			}
    		}
    		return true;
    	}
    	boolean isAllZeroRight(Point p){
    		int j = p.y;
    		for(int i=p.x;i>=0;i--){
    			if(matrix[i][j]=='1'){
    				return false;
    			}
    		}
    		return true;
    	}
    }


    提交之后始终不正确,然后開始网上搜索,才发现题目正确意思是:

    找一个最大矩阵,里面所有是1。

    比例如以下图:

    依据这个图转换能够发现问题,看下图:

    转到这个图就会发现,这就是:http://blog.csdn.net/huruzun/article/details/39717501里面说到的同样问题。

    java代码:

    public class Solution {
        	public int largestRectangleArea(int[] height) {
    		int maxarea = 0;
    		Stack<Integer> sta = new Stack<>();
    		int top ;
    		int top_area;
    		int i = 0;
    		while(i<height.length){
    			if(sta.isEmpty() || height[sta.peek()]<=height[i] ){
    				sta.push(i++);
    			}else{
    				top = sta.pop();
    				top_area = height[top] * (sta.isEmpty()? i:i-sta.peek()-1);
    				if(top_area>maxarea){
    					maxarea = top_area;
    				}
    			}
    		}
    		while(!sta.isEmpty()){
    			top = sta.pop();
    			top_area = height[top] * (sta.isEmpty()? i:i-sta.peek()-1);
    			if(top_area>maxarea){
    				maxarea = top_area;
    			}
    		}
    		return maxarea;
    	}
    	
    	public int maximalRectangle(char[][] matrix){
    		if(matrix.length == 0){
    			return 0;
    		}
    		int row = matrix.length;
    		int col = matrix[0].length;
    		int [][]dp = new int[row][];
    		for(int i=0;i<row;i++){
    			dp[i] = new int[col];
    		}
    		
    		for(int j=0;j<col;j++){
    			if(matrix[0][j]=='1'){
    				dp[0][j] = 1;
    			}
    		}
    		for(int j=0;j<col;j++){
    			for(int i=1;i<row;i++){
    				if(matrix[i][j] == '1'){
    					dp[i][j] = dp[i-1][j]+1;
    				}
    			}
    		}
    		int maxarea = 0;
    		for(int i=0;i<row;i++){
    			int temp = largestRectangleArea(dp[i]);
    			if(temp>maxarea){
    				maxarea = temp;
    			}
    		}
    		return maxarea;
    	}
    }


     

  • 相关阅读:
    OpenGL入门学习
    linux下安装sqlite3
    SQLite 之 C#版 System.Data.SQLite 使用
    .net程序运行流程
    一种简单,轻量,灵活的C#对象转Json对象的方案
    C# 获取Windows系统:Cpu使用率,内存使用率,Mac地址,磁盘使用率
    WPF中选择文件及文件夹
    要想创业成功,千万不能在这十个方面走弯路
    [译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails
    [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4507527.html
Copyright © 2011-2022 走看看