题目如下
class Solution {
public:
int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {
int ans = INT_MIN;
int m = matrix.size(), n = matrix[0].size();
for (int i = 0; i < m; ++i) { // 枚举上边界
vector<int> sum(n);
for (int j = i; j < m; ++j) { // 枚举下边界
for (int c = 0; c < n; ++c) {
sum[c] += matrix[j][c]; // 更新每列的元素和
}
set<int> sumSet{0};
int s = 0;
for (int v : sum) {
s += v;
auto lb = sumSet.lower_bound(s - k);
if (lb != sumSet.end()) {
ans = max(ans, s - *lb);
}
sumSet.insert(s);
}
}
}
return ans;
}
};
这里使用了set::lower_bound(x)函数,这个函数时会采取二分查找的方法,找出大于等于x的第一个值的位置,返回的时一个迭代器。
这题的大概思想是:
我们先从简单m=1出发,我给定一个vector{{5,7,2,-1,8,6}}; k=0;
那么sum[6]={5,7,2,-1,8,6};
sumSet[7]={0,5,12,14,13,21,27}
如果在14插入前,有s=14,s-k=4,lb返回5所在的位置
最后ans被赋值成s-*lb=14-5=9;
这句话的意思其实是第2个和第3个数相加满足题意并且比前面的ans大。
其他同理