题目描述
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
解题思路
动态规划思想,从左上依次遍历到右下,记录以当前位置为右下角顶点的最大正方形的边长,对每个位置作如下操作:
- 若该位置为0,直接跳过
- 若该位置为1,则分为两种情况:
- 若其为左边界或上边界,则更新最大边长为当前数字;
- 否则检查其紧邻左方、紧邻上方和左上角对应的数字,取他们的最小值再加1即为以当前位置为右下角顶点的正方形边长,并更新此时的最大正方形边长
代码
1 class Solution { 2 public: 3 int maximalSquare(vector<vector<char>>& matrix) { 4 int maxN = 0; 5 for(int i = 0; i < matrix.size(); i++){ 6 for(int j = 0; j < matrix[0].size(); j++){ 7 if(matrix[i][j] == '0') continue; 8 if(j == 0 || i == 0){ 9 if(matrix[i][j] - '0' > maxN) maxN = matrix[i][j] - '0'; 10 } 11 else if(matrix[i - 1][j - 1] > '0'){ 12 char x = min(matrix[i - 1][j - 1], matrix[i - 1][j]); 13 x = min(x, matrix[i][j - 1]); 14 matrix[i][j] = x + 1; 15 if(matrix[i][j] - '0' > maxN) maxN = matrix[i][j] - '0'; 16 } 17 } 18 } 19 return maxN * maxN; 20 } 21 };