Сложность: hard
Дана матрица размером m x n и целое число k, вернуть максимальную сумму прямоугольника в матрице, такая что его сумма не превышает k.
Гарантируется, что будет прямоугольник с суммой, не превышающей k.
Пример:
Input: matrix = [[1,0,1],[0,-2,3]], k = 2
Output: 2
Explanation: Because the sum of the blue rectangle [[0, 1], [-2, 3]] is 2, and 2 is the max number no larger than k (k = 2).
👨💻 Алгоритм:
1⃣Создать вспомогательную функцию updateResult, которая будет находить максимальную сумму подмассива в одномерном массиве, не превышающую k.
2⃣Преобразовать каждую подматрицу в одномерный массив и применить к ней функцию updateResult.
3⃣Вернуть максимальную найденную сумму.
😎 Решение:
class Solution {
int result = Integer.MIN_VALUE;
void updateResult(int[] nums, int k) {
int sum = 0;
TreeSet<Integer> sortedSum = new TreeSet<>();
sortedSum.add(0);
for (int num : nums) {
sum += num;
Integer x = sortedSum.ceiling(sum - k);
if (x != null)
result = Math.max(result, sum - x);
sortedSum.add(sum);
}
}
public int maxSumSubmatrix(int[][] matrix, int k) {
int[] rowSum = new int[matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
Arrays.fill(rowSum, 0);
for (int row = i; row < matrix.length; row++) {
for (int col = 0; col < matrix[0].length; col++)
rowSum[col] += matrix[row][col];
updateResult(rowSum, k);
if (result == k)
return result;
}
}
return result;
}
}Ставь 👍 и забирай 📚 Базу знаний
