算法:矩形区域不超过k的数值和
题目
给你一个 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)。
题解
class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int m = matrix.length, n = matrix[0].length;int res = Integer.MIN_VALUE;//矩形上边界for (int i = 0; i < m;i++){// 存储每一列上下边界的之间的每一列面积int[] sum = new int[n];//矩形下边界for (int j = i;j<m;j++){//加入新的下边界就更新sum数组的值for(int c = 0; c < n;c++){sum[c] += matrix[j][c];}TreeSet<Integer> sumSet = new TreeSet<>();sumSet.add(0);int s = 0;//遍历每一列上下边界的和for (int v : sum) {//将每一列的面积相加的到一个矩形面积,这个面积是第一列到当前列的总矩形面积和s += v;//从前面的矩形面积中找一个大于s-k的最小值,然后总矩形面积s-ceil的值就是小于K且是最大的矩形面积// 这个方法利用到了二分,提升性能Integer ceil = sumSet.ceiling(s-k);if(ceil!=null){//总矩形面积-ceil的值就是小于K且是最大的矩形面积res = Math.max(s-ceil, res);}//将面积加入set中sumSet.add(s);}}}return res;}
}
