Maximal Square
2015-06-06 13:11
274 查看
Problem:
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
Return 4.
Solutions:
定义p[i][j]为右下角是点matrix[i][j]的最大全'1'正方形,于是
若matrix[i][j] == 0,则p[i][j] = 0;
若i == 0,则p[0][j] = matrix[0][j] == '0' ? 0 : 1;
若j == 0,则p[i][0] = matrix[i][0] == '0' ? 0 : 1;
若i > 0 && j > 0 && matrix[i][j] == '1', 则p[i][j] = min(p[i-1][j], p[i][j-1], p[i-1][j-1]) + 1;
分析发现p[i][j]只依赖于上一行p[i-1][]和当前行的前一个元素p[i][j-1],于是空间开销可以进一步压缩到O(列数),以下是实现代码(C++):
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 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 4.
Solutions:
定义p[i][j]为右下角是点matrix[i][j]的最大全'1'正方形,于是
若matrix[i][j] == 0,则p[i][j] = 0;
若i == 0,则p[0][j] = matrix[0][j] == '0' ? 0 : 1;
若j == 0,则p[i][0] = matrix[i][0] == '0' ? 0 : 1;
若i > 0 && j > 0 && matrix[i][j] == '1', 则p[i][j] = min(p[i-1][j], p[i][j-1], p[i-1][j-1]) + 1;
分析发现p[i][j]只依赖于上一行p[i-1][]和当前行的前一个元素p[i][j-1],于是空间开销可以进一步压缩到O(列数),以下是实现代码(C++):
int maximalSquare(vector<vector<char>>& matrix) { int n, m; if((n = matrix.size()) < 1 || (m = matrix[0].size()) < 1) return 0; vector<int> dp(m, 0); int pre, cur, res = 0; for(int i = 0; i < n; ++i){ pre = matrix[i][0] - '0'; if(res < pre) res = pre; for(int j = 1; j < m; ++j){ if(matrix[i][j] == '1'){ cur = min(pre, min(dp[j-1], dp[j])) + 1; if(cur > res) res = cur; }else{ cur = 0; } dp[j-1] = pre; pre = cur; } dp[m-1] = pre; } return res * res; }
相关文章推荐
- 超酷JS拖拽翻页效果
- 正确激活笔记本电池的方法
- Duilib教程-HelloDuilib及DuiDesigner的简单使用
- Python3学习之二Django搭建
- js正则表达式详解
- CSS 3.0新增属性
- 黑马程序员--生产者和消费者模式
- 4讲项目实战js展示区
- Duilib教程-简单介绍
- 贪心算法
- CSS基线之道
- 5讲项目实战js第二区域轮播器及选项卡
- 对话框jbox
- canvas极速3D立体式图片相册切换效果
- 黑马程序员——Java基础---常用类(上)
- hdu 1847 Good Luck in CET-4 Everybody!
- 使用ThinkPHP框架高速发展网站(多图)
- OpenCms 9.5.1 新建一个站点
- 使用Ulink2的JTAG与SWD 调试stm32 区别
- 一些平时遇到的英语单词摘录