Lintcode -1278. 不超过K的最大矩形元素之和

本文探讨了一个算法问题:如何在一个给定的二维矩阵中找到元素之和最大但不超过特定值k的矩形区域。通过遍历所有可能的矩形组合,使用辅助数组优化计算过程,实现高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1278. 不超过K的最大矩形元素之和

给定一个非空的二维矩阵 matrix 和一个整数 k,找出 matrix 中的一个矩形,该矩形内的元素之和最大并且不超过 k,返回这个最大和。

样例

给定 matrix = [
  [1,  0, 1],
  [0, -2, 3]
]
k = 2

答案为2。因为矩形[[0, 1], [-2, 3]]的元素之和为2,并且2是不超过k (k = 2)的最大数字。

AC源代码:

class Solution {
public:
    /**
     * @param matrix: a 2D matrix
     * @param k: an integer
     * @return: the max sum of a rectangle in the matrix such that its sum is no larger than k
     */
    int fun(vector<vector<int>> &matrix,vector<vector<int>> &recode, int begin,int end,int allsum,int k){//遍历固定列之间的所有行数的组合
        int len=matrix.size();
        for(int i=0;i<len;i++){
            int sum=0;
            for(int j=i;j<len;j++){
                if(i==0){
                    sum+=linesum(matrix,recode,j,begin,end);//j行的和
                }
                else {
                    sum+=recode[end][j];//第一次遍历过之后,已存储在辅助数组中,不需要再遍历,减小时间复杂度
                }
                if(sum==k){
                    return k;
                }
                else if(sum>allsum&&sum<k){
                    allsum=sum;
                }
            }
            if(allsum==k){return k;}
        }
        return allsum;
    }
    int linesum(vector<vector<int>> &matrix,vector<vector<int>> &recode, int numline,int begin,int end){//特定行、指定列宽的和
        if(begin==end){
            recode[end][numline]=matrix[numline][end];
        }
        else if(end>0){
            recode[end][numline]=recode[end-1][numline]+matrix[numline][end];
        }
        return recode[end][numline];
    } 
    int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {
        // Write your code here
        int len=matrix.size();//行数
        int wid=matrix[0].size();//列数
        int allsum=-1000;
        for(int i=0;i<wid;i++){
            vector<vector<int>> recode(wid);//辅助数组,用于内层存储遍历结果
            for(int p=0;p<wid;p++){
                recode[p].resize(len);
                recode[p]={0};
            }
            int sum=0;
            for(int j=i;j<wid;j++){   //遍历所有列的组合
                allsum=fun(matrix,recode,i,j,allsum,k);
                if(allsum==k){return k;}
            }
            if(allsum==k)return k;
        }
        return allsum;
    }
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值