给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。
示例:
输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2
解释: 矩形区域 [[0, 1], [-2, 3]]
的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。
说明:
- 矩阵内的矩形区域面积必须大于 0。
- 如果行数远大于列数,你将如何解答呢?
Reviewer:
我又读错了题...我求成了最大面积...
心累...
强调一下这个findmax方法,很精妙~
Code:
class Solution {
public int maxSumSubmatrix(final int[][] matrix, int k) {
if (matrix.length == 0) return 0;
int row = matrix.length, col = matrix[0].length, max = Integer.MIN_VALUE;
for (int i = 0; i < col; i++) {
int[] sum = new int[row];
for (int j = i; j < col; j++) {
for (int m = 0; m < row; m++) {
sum[m] += matrix[m][j];
}
max = Math.max(max, findMax(sum, k));
}
}
return max;
}
private static int findMax(int[] sum, int k) {
int cum = 0, max = Integer.MIN_VALUE;
TreeSet<Integer> set = new TreeSet<>();
set.add(0);
for (int i = 0; i < sum.length; i++) {
cum += sum[i];
Integer gap = set.ceiling(cum - k);
if (gap != null) max = Math.max(max, cum - gap);
set.add(cum);
}
return max;
}
}