博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeedCode OJ]#85 Maximal Rectangle
阅读量:5915 次
发布时间:2019-06-19

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

 【 声明:版权全部,转载请标明出处。请勿用于商业用途。

  联系信箱:libin493073668@sina.com】

题目链接:
题意:
给出一个仅仅包括0,1的二维矩阵。要求找到一个全为1的子矩阵。并输出子矩阵的面积
思路:
首先我们对这个矩阵进行求和
dp[i][j]表示以(1,1)为左上角。(i,j)为右下角的子矩阵的1的个数
如今我们要统计蓝色矩形的面积,如果右下角的坐标是(i,j)
此时蓝色矩形的宽与长各自是r,c
那么我们仅仅须要推断蓝色矩形内的1的个数是否与r*c相等,就能够知道这个矩形是否是全1子矩阵
那么怎么统计呢?
我们能够知道dp[i][j]是(1,1)到(i,j)的1的总个数
如果绿色矩阵的左上角是(0,0)
那么绿色矩阵的面积dp[i-r][j-c]
两个红色矩阵的面积各自是dp[i][j-c],dp[i-r][j]
那么统计蓝色矩阵1的个数的式子便是dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]
然后我们仅仅须要以每一个1为右下角,去增大r,c便可
class Solution{public:    int maximalRectangle(vector
>& matrix) { int n = matrix.size(); if(n==0) return 0; int m = matrix[0].size(); int i,j,c; vector
> dp,a; dp.resize(n+1),a.resize(n+1); for(i = 0; i<=n; i++) { dp[i].resize(m+1); a[i].resize(m+1); } for(i = 0; i
0; i--) { for(j = m; j>0&&maxn
=0) { if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c)//是全1矩阵。继续增大列 { maxn = max(maxn,r*c); c++; } else break; } while(i-r>=0&&c>0) { if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c)//是全1矩阵。继续增大行 { maxn = max(maxn,r*c); r++; } else//否则。降低一列再去反复推断 c--; } } } } return maxn; }};
你可能感兴趣的文章
LiteDB —— 轻量级 .NET 嵌入式 NoSQL 数据库
查看>>
《移动App测试实战》——第2章 功能测试自动化
查看>>
告警:IO利用率飚至60%+,请及时排查优化!
查看>>
《为iPad而设计:打造畅销App》——注重市场竞争
查看>>
测试并发应用(六)用 FindBugs 分析并发代码
查看>>
腾讯Android自动化测试实战2.1.2 自动化测试框架基本原理
查看>>
《OSGI官方指南》首页
查看>>
《第一本Docker书(修订版)》——2.9 Docker守护进程
查看>>
《python 与数据挖掘 》一 3.4 作用域
查看>>
[可视化]一张图看懂Python3
查看>>
《R语言数据挖掘》——2.2 购物篮分析
查看>>
Webx系列
查看>>
《Adobe Dreamweaver CC经典教程》——第1课 自定义工作区1.1 浏览工作区
查看>>
《指针的编程艺术(第二版)》一3.2 指针与二维数组
查看>>
发布Xmemcached 1.2.4
查看>>
《阿里感悟》- 技术人员的职业规划
查看>>
《Python数据科学指南》——2.2 使用NumPy库
查看>>
戴文的Linux内核专题:01 介绍
查看>>
《Spark 官方文档》Spark SQL, DataFrames 以及 Datasets 编程指南(三)
查看>>
《NoSQL权威指南》——2.2 技术原理
查看>>