给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold。
请你返回元素总和小于或等于阈值的正方形区域的最大边长;如果没有这样的正方形区域,则返回 0 。
示例 2:
输入:mat = [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]], threshold = 1
输出:0
代码
class Solution {public int getMaxSideLength(int[][] mat,int x1,int y1,int x2,int y2) {return mat[x2][y2]-mat[x1-1][y2]-mat[x2][y1-1]+mat[x1-1][y1-1];//获取正方形的和}public int maxSideLength(int[][] mat, int threshold) {int n=mat.length,m=mat[0].length;int[][] add=new int[n+1][m+1];for(int i=1;i<=n;i++)//构建前缀和for(int j=1;j<=m;j++){add[i][j]=add[i][j-1]+add[i-1][j]-add[i-1][j-1]+mat[i-1][j-1];}int l=1,r= Math.min(n,m),res=0;while (l<=r)//二分法查找最大边长{boolean find=false;int mid=(r-l)/2+l;for(int i=1;i<=n-mid+1;i++)//查找满足的正方形for(int j=1;j<=m-mid+1;j++)if(getMaxSideLength(add,i,j,i+mid-1,j+mid-1)<=threshold){find=true;}if(find)//找到了满足的边长,尝试更大的{res=mid;l=mid+1;}else r=mid-1;}return res;}
}