[LeetCode] Maximal Square
2015-06-03 12:01
344 查看
Maximal Square
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.
枚举就OK了,时间复杂度为O(n^3),276ms AC。
可以使用动态规划优化到O(n^2),下面的代码12ms AC。构造一个新的矩阵dp,dp[i][j]表示以点(i, j)为右下角的正方形的边长;状态转移方程:
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
对于题目所给的例子就有:
转化成:
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.
枚举就OK了,时间复杂度为O(n^3),276ms AC。
class Solution { public: int getArea(vector<int> &array, int k) { if (array.size() < k) return 0; int cnt = 0; for (int i = 0; i < array.size(); ++i) { if (array[i] != k) cnt = 0; else ++cnt; if (cnt == k) return k * k; } return 0; } int maximalSquare(vector<vector<char>>& matrix) { vector<int> array; int res = 0; for (int i = 0; i < matrix.size(); ++i) { array.assign(matrix[0].size(), 0); for (int j = i; j < matrix.size(); ++j) { for (int k = 0; k < matrix[0].size(); ++k) if (matrix[j][k] == '1') ++array[k]; res = max(res, getArea(array, j-i+1)); } } return res; } };
可以使用动态规划优化到O(n^2),下面的代码12ms AC。构造一个新的矩阵dp,dp[i][j]表示以点(i, j)为右下角的正方形的边长;状态转移方程:
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
对于题目所给的例子就有:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
转化成:
1 0 1 0 0 1 0 1 1 1 1 1 1 2 1 1 0 0 1 0
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { if (matrix.empty() || matrix[0].empty()) return 0; int M = matrix.size(), N = matrix[0].size(), res = 0; vector<vector<int>> dp(M, vector<int>(N, 0)); for (int i = 0; i < M; ++i) if (matrix[i][0] == '1') { dp[i][0] = 1; res = 1; } for (int j = 0; j < N; ++j) if (matrix[0][j] == '1') { dp[0][j] = 1; res = 1; } for (int i = 1; i < M; ++i) { for (int j = 1; j < N; ++j) { if (matrix[i][j] == '1') dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1; res = max(res, dp[i][j]); } } return res * res; } };
相关文章推荐
- 程序员最容易犯得错误
- TOWebViewController(Convert HTML5 To IOS App)
- 老子《道德经》真本
- java中调用c(c++)写的dll文件的实现及步骤(转)
- LVS-NAT模型/LVS-DR模型实践
- 小功率MTTP太阳能充电器(一)
- Redis Nosql数据库
- PHP分页类
- [erlang]erlang与C++的两种通讯方式
- 【Linux0.11 内核源码剖析】进程间通信——管道(pipe)
- Path Sum II
- document.onmouseover事件的广泛性
- Step into Gradle - 01 - 基本使用
- ios 同步异步消息
- iOS 根据图片URL从本地相册获取图片
- jquery中添加属性和删除属性
- Python找出文件中使用率最高的汉字实例详解
- ndroid中Activity四种启动模式和taskAffinity属性详解
- 课程设计---约瑟夫环
- 021_04Fragment简单应用