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

  

 

posted @ 2021-11-21 16:31  sherry001  阅读(69)  评论(0编辑  收藏  举报