与えられた m x n
行列 mat
と整数を threshold
。未満の和を有する正方形の最大辺長を返すか、等しい threshold
か、そのような正方形がない場合は0を返します。
例1:
入力:マット= [1,1,3,2,4,3,2]、[1,1,3,2,4,3,2]、[1,1,3,2,4,3、 2]、閾値= 4
出力:2
説明:示されるように和を有する正方形の最大辺の長さは4以上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,2,2]、しきい値= 1つの
出力:0
例3:
入力:マット= [1,1,1,1]、[1,0,0,0]、[1,0,0,0]、[1,0,0,0]、閾値= 6
出力:3
例4:
入力:マット= [18,70]、[61,1]、[25,85]、[14,40]、[11,96]、[97,96]、[63,45]、閾値= 40184
出力:2
制約:
1 <= m, n <= 300
m == mat.length
n == mat[i].length
0 <= mat[i][j] <= 10000
0 <= threshold <= 10^5
最大の正方形の一方の辺の長さを見つけるためのマトリックスを与え、正方形および要素が閾値未満です。
ソリューション:
接頭二次元、和[i] [j]はの[I] [J]に[0] [0]を示し、矩形の要素と、この合計で、使用することは、O(行* COL *分(であることができますすべての正方形を介して行、列))の時間複雑。
class Solution { public: int maxSideLength(vector<vector<int>>& mat, int threshold) { int row = mat.size(), col = mat[0].size(); vector<vector<int>> sum(row+1, vector<int>(col+1, 0)); for(int i=1; i<=row; i++) for(int j=1; j<=col; j++) sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mat[i-1][j-1]; int ret = 0; for(int i=1; i<=row; i++) for(int j=1; j<=col; j++){ for(int k=1; k<=min(i, j); k++){ int temp = sum[i][j]-sum[i-k][j]-sum[i][j-k]+sum[i-k][j-k]; if(temp <= threshold) ret = max(ret, k); } } return ret; } };