首先预处理得到矩阵sum[i][j],表示从左上角(0,0)到(i,j)处的所有元素之和。注意技巧,sum在定义时两个维度大小都增1。
对于每一个sum[i][j],判断是否存在以(i,j)为右下角、边长为k的正方形,k的取值从1到不越界。判断表达式是:
if (sum[i][j]-sum[i-1][j]-sum[i][j-1]+sum[i-1][j-1] == k*k)
73ms
完全类似于 leetcode 85 maximal rectangular,变换成在一维上求最大正方形。
核心思想:不断加入数组元素,维护一个非减的栈序列,注意栈元素是数组的index而不是数值本身。遇到下一个数组元素比栈顶元素小的时候,退栈,判断该栈顶元素能够围成的最大正方形空间。
if (height[i]>=height[s.top()])
{push(i); continue;}
else
{ int H=height[s.top()];
s.pop();
result = max(result,min(H,i-s.top()-1);
}
9ms
设计dp[i][j]表示右下角为(i,j)的最大正方形边长。则有动态转移方程:
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1