解法:动态规划
使用3维数组dp[m + 1][n + 1][2]
dp[i][j][0]:表示第i行第j列的1往 左边 最长连续的1的个数
dp[i][j][1]:表示第i行第j列的1往 上面 最长连续的1的个数
dp数组比grid数组上左两边多一层。
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid) {
if(grid.empty()) return 0;
int m=grid.size();
int n=grid[0].size();
int maxLen=0;
vector<vector<vector<int>>> dp(m+1,vector<vector<int>>(n+1,vector<int>(2,0)));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
dp[i+1][j+1][0] = dp[i+1][j][0]+1; //左
dp[i+1][j+1][1] = dp[i][j+1][1]+1; //上
//以当前的1为右下角要构成正方形,其边长最长是左边或上面最长连续的1的个数中的较小值
int side=min(dp[i+1][j+1][0],dp[i+1][j+1][1]);
//判断上左两边能否满足这个边长
while(side>maxLen){ // side>0
if(dp[i+1][j-side+2][1]>=side && dp[i-side+2][j+1][0]>=side)
break;
side--; //若不能就取次小的边长
}
maxLen=max(maxLen,side);
}
}
}
return maxLen*maxLen;
}
};