题目链接官方提供了两种方法,也有详细的解释。两种方法的共同点是使用前缀数组在O(1)时间内查找矩形和内的任意元素。(正方形也是长方形,只是这里前缀数组不能只找到正方形)第一种方法二分正方形的边长。官方的解决方案说如果直接迭代查找会超时。第二种方法是优化迭代,思路是每次从当前找到的最大方边长开始迭代。二分搜索classSolution:defmaxSideLength(self,mat:List[List[int]],threshold:int)->int:n,m=len(mat),len(mat[0])P=[[0]*(m+1)for_inrange(n+1)]foriinrange(1,n+1):forjinrange(1,m+1):P[i][j]=P[i-1][j]+P[i][j-1]-P[i-1][j-1]+mat[i-1][j-1]l,r=0,min(m,n)ans=0defget_sum(x1,y1,x2,y2):返回P[x2][y2]+P[x1][y1]-P[x1][y2]-P[x2][y1]而l<=r:mid=(l+r)>>1find=any(get_sum(i,j,i+mid,j+mid)<=thresholdforiinrange(0,n-mid+1)forjinrange(0,m-mid+1))iffind:ans=max(ans,mid)l=mid+1else:r=mid-1returnans枚举类解:defmaxSideLength(self,mat:List[List[int]],threshold:int)->int:n,m=len(mat),len(mat[0])P=[[0]*(m+1)for_inrange(n+1)]f或i在范围(1,n+1)中:对于j在范围(1,m+1)中:P[i][j]=P[i-1][j]+P[i][j-1]-P[i-1][j-1]+mat[i-1][j-1]ans=0#forpinP:print(p)defget_sum(x1,y1,x2,y2):返回P[x2][y2]+P[x1][y1]-P[x1][y2]-P[x2][y1]i=0whilei
