美文网首页
Max Sum of Rectangle No Larger T

Max Sum of Rectangle No Larger T

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-05-04 19:34 被阅读40次

题目来源
求一个矩阵中矩形的和不大于k最接近k的和是多少。
我想了想,只能想到最naive的做法,就是直接把所有的矩形都求和,然后比较。
代码如下:

class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
        int rows = matrix.size(), cols = matrix[0].size();
        vector<vector<int>> sums(rows+1, vector<int>(cols+1, 0));
        for (int i=1; i<=rows; i++)
            for (int j=1; j<=cols; j++)
                sums[i][j] = sums[i-1][j] + sums[i][j-1] - sums[i-1][j-1] + matrix[i-1][j-1];
        int dif = INT_MAX, res = 0;
        for (int i=1; i<=rows; i++)
            for (int j=1; j<=cols; j++) {
                for (int x=1; x<=i; x++)
                    for (int y=1; y<=j; y++) {
                        int endWithXYsums = sums[i][j] - sums[x-1][j] - sums[i][y-1] + sums[x-1][y-1];
                        if (endWithXYsums <= k && dif > k - endWithXYsums) {
                            dif = k - endWithXYsums;
                            res = endWithXYsums;
                            if (res == 0)   //一个小剪枝,但是貌似并没有什么软用
                                return endWithXYsums;
                        }
                    }
            }
        return res;
    }
};

可以AC,但是复杂度比较高。想想还有哪些是不需要重复计算的。想不出来…
总的思路就是设两个指针从左向右遍历,每次计算指针范围内的每一行的和。
然后利用lower_bound来找出最符合我们要求的。

class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
        int rows = matrix.size(), cols = matrix[0].size();
        int res = INT_MIN;
        for (int l=0; l<cols; l++) {
            vector<int> sums(rows, 0);
            for (int r=l; r<cols; r++) {
                for (int i=0; i<rows; i++)
                    sums[i] += matrix[i][r];
                set<int> cusums;
                cusums.insert(0);
                int cursum = 0, curMax = INT_MIN;
                for (auto sum : sums) {
                    cursum += sum;
                    set<int>::iterator it = cusums.lower_bound(cursum - k);
                    if (it != cusums.end())
                        curMax = max(curMax, cursum - *it);
                    cusums.insert(cursum);
                }
                res = max(res, curMax);
            }
        }
        return res;
    }
};

相关文章

网友评论

      本文标题:Max Sum of Rectangle No Larger T

      本文链接:https://www.haomeiwen.com/subject/jzzrtxtx.html