Сложность: 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⃣Вернуть максимальную найденную сумму.
😎 Решение:
using System;
using System.Collections.Generic;
public class Solution {
private int result = int.MinValue;
private void UpdateResult(int[] nums, int k) {
int sum = 0;
var sortedSum = new SortedSet<int> { 0 };
foreach (int num in nums) {
sum += num;
var x = sortedSum.GetViewBetween(sum - k, int.MaxValue);
if (x.Count > 0) {
result = Math.Max(result, sum - x.Min);
}
sortedSum.Add(sum);
}
}
public int MaxSumSubmatrix(int[][] matrix, int k) {
int rows = matrix.Length;
int cols = matrix[0].Length;
for (int i = 0; i < rows; i++) {
var rowSum = new int[cols];
for (int row = i; row < rows; row++) {
for (int col = 0; col < cols; col++) {
rowSum[col] += matrix[row][col];
}
UpdateResult(rowSum, k);
if (result == k) {
return result;
}
}
}
return result;
}
}
Ставь 👍 и забирай 📚 Базу знаний
