給你一個大小為 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;}
}