最接近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; }