221. 最大正方形
题目
在一个由 '0'
和 '1'
组成的二维矩阵内,找到只包含 '1'
的最大正方形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:4
示例 2:
输入:matrix = [["0","1"],["1","0"]] 输出:1
示例 3:
输入:matrix = [["0"]] 输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
为'0'
或'1'
思路
因为题中要求在0和1组成的矩阵中找最大全1正方形,所以我们可以通过统计正方形的边来确定。dp[i][j]是以(i,j)为右下角的最大正方形边长。若当前元素是1,分两种情况:如果在最上方或最左方,边长为1;否则,边长由上方、左方、左上方的最大正方形边长值决定,因为正方形边长受限于最短边,所以取三者最小值加1(正方形的四条边必须相等,所以只能取最短的那条边加 1)。遍历矩阵时记录最大边长。
代码
class Solution {
public:int maximalSquare(vector<vector<char>>& matrix) {int n=0;//最大正方形的边长int h=matrix.size(),l=matrix[0].size();//行数和列数vector<vector<int>> dp(h,vector<int> (l));//统计每个位置能构成正方形的最大边for(int i=0;i<h;i++){for(int j=0;j<l;j++){if(matrix[i][j]=='1'){if(i==0||j==0)//最左边和最上边的格子{dp[i][j]=1;//当前位置能构成的最大正方形边长为1}else{
//最大正方形边长,取决于上方、左方和左上方三个相邻位置能构成的正方形边长的最小值加1dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;}n=max(n,dp[i][j]);//最大边}}}return n*n;}
};