Maximal Square
2015-06-17 21:27
134 查看
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.
解题思路:
从小到大枚举最大全1正方形的边长,我们验证当前边长长度时是否存在一个正方形是全1正方形,如果得到则直接退出。我们可以利用这个方法来验证这个问题,首先每个元素要么是0要么是1,这样如果一个子正方形是全1正方形的时候,则子正方形的元素和正好为政方面的面积,问题得以解决。
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.
解题思路:
从小到大枚举最大全1正方形的边长,我们验证当前边长长度时是否存在一个正方形是全1正方形,如果得到则直接退出。我们可以利用这个方法来验证这个问题,首先每个元素要么是0要么是1,这样如果一个子正方形是全1正方形的时候,则子正方形的元素和正好为政方面的面积,问题得以解决。
class Solution { public: /* 枚举 + DP */ int maximalSquare(vector<vector<char>>& matrix) { int arr[210][210]; int sum[210][210]; int n = matrix.size(); if(n == 0) return 0; int m = matrix[0].size(); if(m == 0) return 0; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { arr[i][j] = matrix[i-1][j-1] - '0'; } } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { sum[i][j] = arr[i][j]; sum[i][j] += sum[i][j-1]; sum[i][j] += sum[i-1][j]; sum[i][j] -= sum[i-1][j-1]; } } bool ok = false; int ans = 0; int len = min(n, m); for(int k = len - 1; k >= 0; --k) { for(int i = 1; i + k <= n; ++i) { for(int j = 1; j + k <= m; ++j) { int x1 = i, y1 = j; int x2 = i + k, y2 = j + k; if(sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1] == (k+1)*(k+1)) { ok = true; ans = (k+1)*(k+1); break; } } if(ok) break; } if(ok) break; } return ans; } };
相关文章推荐
- SP_who2分析数据库性能
- GO GO GO
- 小组互评以及自评
- 黑马程序员------判断语句、循环语句及break、continue
- Linux|XAMPP 搭建Discuz论坛一
- 【嘟嘟工作室】 UEFI GUI 最新界面 duduworks@163.com
- Linux命令之——Date命令详解
- MAC版photoshop CS6安装与破解
- 笔记二 排序
- 转载:用Kafka实时复制PostgreSQL里的最新数据
- android ndk 入门之打印log信息
- 我找回我自己
- LeetCode—Reverse Linked List—C++
- 实战TinyXML
- 第三章:Android之NDK的使用
- 《浪潮之巅》阅读笔记之三
- 2015年6月17日-总结
- Uva - 11059 - Maximum Product
- 我不在乎别人的笑
- Uva - 11059 - Maximum Product