最接近K的子矩阵和

子矩阵的问题先看子数组,问题转化
数组中的有正,有负,有0
在一个数组中,求累加和小于等于K,离K最近的数
前缀和
尝试策略
假设,子数组必须以i位置结尾,累加和小于等于K,离K最近的
eg: k=20. <=20
0.....j....i. sum =100 那么其实就是在求0....j 累加和是>=80最近的,j+1.....i<=20离20最近的
准备一个前缀和有序表 ,求得0-0,0-1 ,0-2,0-3....,0-i-1所有的累加和


求子矩阵,累加和最接近K的数

private int process(int[][] grid,int k){
int n=grid.length;
int[] a0=grid[0];
int max=getMaxLessOrEqualsK(a0,k);
for(int i=1;i<n;i++){
int[] ai=grid[i];
for(int j=0;j< grid[i].length;j++){
ai[j]+=max;
}
max=Math.max(max,getMaxLessOrEqualsK(ai,k));
}
return max;
}
private int getMaxLessOrEqualsK(int[] arr,int k){
TreeSet<Integer> set=new TreeSet<>();
set.add(0);
int max=Integer.MIN_VALUE;
int sum=0;
for(int i=0;i<arr.length;i++){
sum+=arr[i];
if(set.ceiling(sum-k)!=null){
max=Math.max(max,sum-set.ceiling(sum-k));
}
set.add(sum);
}
return max;
}

浙公网安备 33010602011771号