class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
if (matrix == null || matrix.length == 0) {
return 0;
}
int m = matrix.length, n = matrix[0].length;
int res = Integer.MIN_VALUE;
for (int leftCol = 0; leftCol < n; leftCol++) {
int[] rowSum = new int[m];
for (int rightCol = leftCol; rightCol < n; rightCol++) {
for (int i = 0; i < m; i++) {
rowSum[i] += matrix[i][rightCol];
}
TreeSet<Integer> set = new TreeSet<>();
set.add(0);
int prefixSum = 0;
for (int sum : rowSum) {
prefixSum += sum;
Integer num = set.ceiling(prefixSum - k);
if (num != null) {
res = Math.max(res, prefixSum - num);
}
set.add(prefixSum);
}
}
}
return res;
}
}
(2) Kadane Algorithm优化
思想: 这里的优化用Maximum Subarray里的kadane algorithm, 在我们遍历每个submatrix的的同时,我们利用maximum subarray的思路找出当前submatrix的最大值,如果该最大值小于等于K,则我们直接与res比较,而不必要通过treeSet,找到符合条件的submatrix sum
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
if (matrix == null || matrix.length == 0) {
return 0;
}
int m = matrix.length, n = matrix[0].length;
int res = Integer.MIN_VALUE;
for (int leftCol = 0; leftCol < n; leftCol++) {
int[] rowSum = new int[m];
for (int rightCol = leftCol; rightCol < n; rightCol++) {
int maxSum = Integer.MIN_VALUE;
int curMaxSum = 0;
for (int i = 0; i < m; i++) {
// Optimization with Kadane Algorithm
rowSum[i] += matrix[i][rightCol];
curMaxSum = Math.max(rowSum[i], curMaxSum + rowSum[i]);
maxSum = Math.max(maxSum, curMaxSum);
}
if (maxSum <= k) {
res = Math.max(maxSum, res);
continue;
}
TreeSet<Integer> set = new TreeSet<>();
set.add(0);
int prefixSum = 0;
for (int sum : rowSum) {
prefixSum += sum;
Integer num = set.ceiling(prefixSum - k);
if (num != null) {
res = Math.max(res, prefixSum - num);
}
set.add(prefixSum);
}
}
}
return res;
}
}