給你一個 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<=slInteger ceiling = set.ceiling(cur - k);if(ceiling!=null)res=Math.max(res,cur-ceiling);set.add(cur);}}}return res;}
}