363. 矩形区域不超过 K 的最大数值和

158 阅读1分钟

363. 矩形区域不超过 K 的最大数值和

主要思想为:1.枚举行的取值范围,确定行的开始范值与结束值,通过将范围的行数从零开始叠加,来减少代码量,同时每次根据行的范围,得到一列数组,根据数组确定列的范围,列下标需要满足,Sr-Sl<=K,其中Si表示前n个数的和Si=0, if i=0; si=a0+a1+a2+...+ai if 1<=i<=N。 2.需要做的是通过枚举Sr确定满足条件的最小的Sl,而最小的sr可以保证最大的Sr-Sl,由于Sl一定在Sr的左边,因此可以一边维护Sr一边寻找Sl,最后获取满足条件的最大的Sr-Sl。

public:
//穷举法
//枚举行的范围
//将行范围内的值相加,选择列,变成一维数组确定区间和小于k的最大值的范围
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
        int m=matrix.size(),n=matrix[0].size();
        int ans=INT_MIN;
        //枚举行
        for(int i=0;i<m;++i){
            vector<int> v(n);
            for(int j=i;j<m;++j){
                //分别为第0列,第0列和第1列。。。。
                for(int c=0;c<n;++c){
                    v[c]+=matrix[j][c];
                }
                //sr-sl<=k,求最小的sl,sl>=sr-k
                set<int> numSet{0};
                int sr=0;
                for(auto i:v){
                    sr+=i;
                    auto  lb=numSet.lower_bound(sr-k);
                    if(lb!=numSet.end()){
                        ans=max(ans,sr-*lb);
                    }
                    numSet.insert(sr);
                }
            }



        }
        return ans;

    }
};