博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode -- Maximal Rectangle TODO O(N)
阅读量:6689 次
发布时间:2019-06-25

本文共 3727 字,大约阅读时间需要 12 分钟。

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

 

[解题思路]

1.brute force

枚举所有sub-matrix(O(N^2), N = m*n) ,检查每个子矩阵是不是都是1,如果是更新最大面积,检查子矩阵是否都是1需要

花费O(N). 故总的时间为O(N^3) N = m*n

可以过小数据,大数据直接TLE

1 public int maximalRectangle(char[][] matrix) { 2         // Start typing your Java solution below 3         // DO NOT write main() function 4         int m = matrix.length; 5         if(m == 0){ 6             return m; 7         } 8         int n = matrix[0].length; 9         if(n == 0){10             return n;11         }12         13         return generateMaxArea(matrix);14     }15     16     private static int generateMaxArea(char[][] matrix) {17         int m = matrix.length;18         int n = matrix[0].length;19         int maxArea = 0;20         for (int i = 1; i <= m; i++) {21             for (int j = 1; j <= n; j++) {22                 int subMatrixArea = enumerateSubMatrix(matrix, i, j);23                 if (subMatrixArea > maxArea) {24                     maxArea = subMatrixArea;25                 }26             }27         }28         return maxArea;29     }30 31     public static int enumerateSubMatrix(char[][] matrix, int i, int j) {32         int m = matrix.length;33         int n = matrix[0].length;34         int subMatrixArea = 0;35         for (int p = 0; p <= (m - i); p++) {36             for (int q = 0; q <= (n - j); q++) {37                 int area = getSubMatrixArea(matrix, p, q, p + i - 1, q + j - 1);38                 if (area > subMatrixArea) {39                     subMatrixArea = area;40                 }41             }42         }43         return subMatrixArea;44     }45 46     private static int getSubMatrixArea(char[][] matrix, int p, int q, int i,47             int j) {48         for (int m = p; m <= i; m++) {49             for (int n = q; n <= j; n++) {50                 if (matrix[m][n] == '0') {51                     return 0;52                 }53             }54         }55 56         return (i - p + 1) * (j - q + 1);57     }

 2.DP

令dp[i][j]表示点(i,j)开始向右连续1的个数,花费O(M*N)的时间可以计算出来

接着从每个点开始,将该点作为矩形左上角点,从该点开始向下扫描直到最后一行或者dp[k][j] == 0

每次计算一个矩形的面积,与最大面积进行比较,如最大面积小于当前面积则进行更新,总的时间复杂度为O(M*N*M)

1 public int maximalRectangle(char[][] matrix) { 2         // Start typing your Java solution below 3         // DO NOT write main() function 4         int m = matrix.length; 5         if(m == 0){ 6             return m; 7         } 8         int n = matrix[0].length; 9         int[][] dp = new int[m][n];10         11         for(int i = 0; i < m; i++){12             for(int j = 0; j < n; j++){13                 if(matrix[i][j] == '0'){14                     continue;15                 } else {16                     dp[i][j] = 1;17                     int k = j + 1;18                     while(k < n && (matrix[i][k] == '1')){19                         dp[i][j] += 1;20                         k++;21                     }22                 }23             }24         }25         int maxArea = 0;26         for(int i = 0; i < m; i++){27             for(int j = 0; j < n; j++){28                 if(dp[i][j] == 0){29                     continue;30                 } else{31                     int area = 0, minDpCol = dp[i][j];32                     for(int k = i; k < m && dp[k][j] > 0; k++){33                         if(dp[k][j] < minDpCol){34                             minDpCol = dp[k][j];35                         }36                         area = (k - i + 1) * minDpCol;37                         if(area > maxArea){38                             maxArea = area;39                         }40                     }41                 }42             }43         }44         return maxArea;45     }

 

转载地址:http://uezoo.baihongyu.com/

你可能感兴趣的文章
IPV6与VOIP
查看>>
Google搜索引擎特殊结果展示介绍
查看>>
集合框架-可变参数
查看>>
Nginx代理显实真实IP的解决
查看>>
开源的企业虚拟化平台:CecOS
查看>>
由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
查看>>
gns3 protocol is down的一个问题终于找到解决对策了
查看>>
centos 7 配置 iptable-service
查看>>
Css3之基础-9 Css 显示(显示方式、显示效果、光标)
查看>>
lamp环境搭建及应用(rpm)
查看>>
微软新推出大礼包了
查看>>
Cisco路由器密码重置
查看>>
RHCS+ISCSI+web构建高可用性群集
查看>>
Hive 数据库仓库的基本操作
查看>>
Spring AOP之简单实践
查看>>
Linux Bash脚本练习5
查看>>
我的友情链接
查看>>
apache禁止解析php文件
查看>>
linux用户和组的权限
查看>>
VSphere 架构和部署
查看>>