给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。
题目数据保证总会存在一个数值和不超过 k 的矩形区域。
示例 1:
输入:matrix = [[1,0,1],[0,-2,3]], k = 2
输出:2
解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。
解题思路
枚举上下边界,确定了上下边界以后,利用一维数组记录每一列的和,就可以通过这个一维数组计算得出当前上下边界固定的情况下所有子矩阵的和,公式为Sr-Sl<=k,Sr为前R列的矩阵和,Sl为前l列的矩阵和,Sr-Sl即为l-r列的子矩阵和,枚举Sr,通过TreeSet查找满足Sr-Sl<=k的Sl。
代码
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
int n=matrix.length,m=matrix[0].length;
int res=Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
int[] sum = new int[m];
for (int j = i; j < n; j++) {
for (int p = 0; p < m; p++) {
sum[p]+=matrix[j][p];
}
TreeSet<Integer> set = new TreeSet<>();
int cur=0;
set.add(0);
for (int l : sum) {
cur+=l;
//sr-k<=sl
Integer ceiling = set.ceiling(cur - k);
if(ceiling!=null)
res=Math.max(res,cur-ceiling);
set.add(cur);
}
}
}
return res;
}
}