221 题 : 全1 正方形的最大面积
分析 : DP思想:首j先确定边长:边长受短边影响 ,所以
dp[i][j]= min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) +1 获取最小边
同时为了少遍历一次 ,直接保存可以满足正方形的最大边
maxSide = max(side, dp[i][j])
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int l1 = matrix.size();
if (l1 == 0) return 0;
int l2 = matrix[0].size();
vector<vector<int>> dp(l1,vector<int>(l2));
int maxSide =0;
for(int i =0; i<l1; ++i)
for(int j =0; j<l2; ++j)
{
if(matrix[i][j] =='1')
{
if(i==0 || j==0)
dp[i][j] = 1;
else
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1; // 受最短边影响
}
maxSide = max(maxSide, dp[i][j]);
}
return maxSide * maxSide;
}
};
力扣:1139 题
边框全是1 的最大正方形面积
思想 : 还是DP思想: 由于不考虑,内部, 所以需要跳着比较
保存两个数组: left Top 分辨维护连续为1 的 长度
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid) {
int l1 = grid.size();
if(l1 == 0) return 0;
int l2 = grid[0].size();
vector<vector<int>> top = grid;
vector<vector<int>> left = grid;
for(int i =0; i<l1; ++i)
for(int j =0; j<l2; ++j)
if(grid[i][j]) //这里不能写 i!=0 j !=0 因为还有i=0 j的其他情况
{
top[i][j] = i>0 ? top[i-1][j]+1 :1;
left[i][j]= j>0 ? left[i][j-1]+1 :1;
}
for(int a =min(l1,l2); a>0; --a)//边长
for(int i=l1-1; i-a+1>=0; --i)//不能越界
for(int j=l2-1; j-a+1>=0; --j)//不能越界
if(left[i][j]>=a && left[i-a+1][j] >=a &&
top[i][j]>=a && top[i][j-a+1] >=a)
return a*a;
return 0;
}
};