对于一维数组,求每个数从数组第一个元素开始的累计和sum[i],对于每一个数num[i]而言,要找到sum[i] - sum[j]<=k,且sum[j]最小的数,用java Treemap进行二分查找即可。
而二维数组,可以进行遍历,将相同列的数累加,转换成一维数组的形式。
解决row>column的方式:按照列的方式进行累加和的计算以及二分查找。
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
int result = -999999;
int row = matrix.length, column = matrix[0].length;
if (row <= column){
for (int i = 0; i < row; ++i) {
int[] array = new int[column];
for (int j = i; j < row; ++j){
//高度j-i+1
TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(0, 0);
for(int n = 0; n < column; ++n)
array[n] += matrix[j][n];
int sum = 0;
for(int n = 0; n < column; ++n){
sum += array[n];
//寻找map>=sum -k的最小的数
Integer key = map.ceilingKey(sum - k);
if (key != null){
if (sum - key >= result)
result = sum - key;
}
map.put(sum, sum);
}
}
}
}
else{
for (int i = 0; i < column; ++i) {
int[] array = new int[row];
for (int j = i; j < column; ++j){
//宽度j-i+1
TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(0, 0);
for(int n = 0; n < row; ++n)
array[n] += matrix[n][j];
int sum = 0;
for(int n = 0; n < row; ++n){
sum += array[n];
//寻找map>=sum -k的最小的数
Integer key = map.ceilingKey(sum - k);
if (key != null){
if (sum - key >= result)
result = sum - key;
}
map.put(sum, sum);
}
}
}
}
return result;
}
}