主要思想为: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;
}
};