Учитывая 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] представляют [0] [0] по [I] [J] из прямоугольных элементов и, с этой суммой, использование может быть O (строку * кол * мин ( строка, столбец)) временная сложность через всю площадь.
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; } };