leetCode_Max Sum of Rectangle No Larger Than K

题意:给定一个二维整数数组,找出一个子矩形,使得该子矩形的和不超过K且和最大

思路:简单的思路就是枚举起点和终点,然后每行每列sum数组,加加减减即可,显然会超时。

优化的思路:枚举起点列和终点列,枚举每一行,把前面的和放在集合里,集合有lower_bound方法可以二分查找,找到合适的值即可。

代码如下:

class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int r) {
        int i,j,k,m,n,ans=INT_MIN,ei,ej,temp;
        m=matrix.size();
        if(m==0) return 0;
        else n=matrix[0].size();
        for(i=0;i<n;i++)
        {
            vector<int> tsum(m,0);
            for(j=i;j<n;j++)
            {
                set<int> st{0};
                int curSum=0;
                for(k=0;k<m;k++)
                {
                    tsum[k]+=matrix[k][j];
                    curSum+=tsum[k];
                    auto it=st.lower_bound(curSum-r);
                    if((it!=st.end())&&curSum-*it<=r) ans=max(ans,curSum-*it);
                    st.insert(curSum);
                }
            }
        }
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值