【题目】
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
【思路】
这道题我想着用【数组中最大矩形】的思路来做,想复杂了……
我们首先遍历每一行,得到高度。使用一位数组:matrix[i][j] == '1'时,dp[j] = dp[j] + 1;否则dp[j] = 0.
用一个变量max_size存储当前最大边长,当每一行的高度数组中,连续大于max_size的元素个数大于max_size,那么max_size++。
最后返回max_size * max_size。
(真方法真机智~)
【代码】
python版本
class Solution(object):
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
if not matrix or not matrix[0]:
return 0;
dp = [0] * len(matrix[0])
max_size = 0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == '1':
dp[j] += 1
else:
dp[j] = 0
# 统计dp数组中连续>max_size的元素个数
count = 0
for j in range(len(matrix[0])):
if dp[j] > max_size:
count += 1
if count > max_size:
max_size = count;
break;
else:
count = 0
return max_size * max_size
C++版本
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0)
return 0;
int max_size = 0;
vector<int> dp(matrix[0].size(), 0);
for(int i=0; i < matrix.size(); i++){
int count = 0;
for(int j=0; j < matrix[0].size(); j++){
if(matrix[i][j] == '1')
dp[j]++;
else
dp[j] = 0;
}
for(int j=0; j < matrix[0].size(); j++){
// 是否height > max_size的个数 > max_size
if(dp[j] > max_size){
count++;
if(count > max_size){
max_size = count;
break;
}
}else
count = 0;
}
}
return max_size * max_size;
}
};