leetcode-363:矩形区域不超过 K 的最大数值和

简介: leetcode-363:矩形区域不超过 K 的最大数值和

题目

题目连接

给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。

题目数据保证总会存在一个数值和不超过 k 的矩形区域。

示例 1:

输入:matrix = [[1,0,1],[0,-2,3]], k = 2
输出:2
解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。

示例 2:

输入:matrix = [[2,2,-1]], k = 3
输出:3

解题

参考链接

方法一:前缀和+暴力枚举

首先记录前缀和

依次枚举左上角和右下角这两个点,

class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
        int m=matrix.size(),n=matrix[0].size();
        int prefix[110][110]={0};
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                prefix[i][j]=prefix[i-1][j]+prefix[i][j-1]+matrix[i-1][j-1]-prefix[i-1][j-1];
            }
        }
        int res=INT_MIN;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                for(int p=i;p<=m;p++){
                    for(int q=j;q<=n;q++){
                        int cur=prefix[p][q]-prefix[i-1][q]-prefix[p][j-1]+prefix[i-1][j-1];
                        if(cur<=k){
                            res=max(res,cur);
                        }
                    }
                }
            }
        }
        return res;
    }
};

方法二:前缀和+set+二分查找

矩形区域是由4条边来确定的,因此可以先固定上下两条边,和右边界

矩形的左边界,类似于两数之和的思路,可以采用二分查找的方式

存入set中,保证有序,可以采用二分查找的方式

为了满足right-left<=k,因此要保证左边界要大于等于 set.lower_bound(right-k)

class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
        int m=matrix.size(),n=matrix[0].size();
        vector<vector<int>> prefix(m+1,vector<int>(n+1,0));
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                prefix[i][j]=prefix[i-1][j]+prefix[i][j-1]+matrix[i-1][j-1]-prefix[i-1][j-1];
            }
        }
        int res=INT_MIN;
        for(int top=1;top<=m;top++){
            for(int bottom=top;bottom<=m;bottom++){
                set<int> set;
                set.insert(0);
                for(int r=1;r<=n;r++){
                    int right=prefix[bottom][r]-prefix[top-1][r];
                    auto left=set.lower_bound(right-k);
                    if(left!=set.end()){
                        int cur=right-*left;
                        res=max(res,cur);
                    }
                    set.insert(right);
                }
            }
        }
        return res;
    }
};
相关文章
|
7月前
|
Java
2048. 下一个更大的数值平衡数 --力扣 --JAVA
如果整数  x 满足:对于每个数位 d ,这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n ,请你返回 严格大于 n 的 最小数值平衡数 。 0 <= n <= 106
144 3
|
7月前
|
索引
leetcode-84:柱状图中最大的矩形
leetcode-84:柱状图中最大的矩形
68 0
|
7月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 223. 矩形面积 算法解析
☆打卡算法☆LeetCode 223. 矩形面积 算法解析
LeetCode 223. 矩形面积
LeetCode 223. 矩形面积
75 0
|
开发者
【Leetcode -485.最大连续1的个数 -492.构造矩形】
【Leetcode -485.最大连续1的个数 -492.构造矩形】
39 0
|
6月前
|
存储 SQL 算法
LeetCode 题目 85:最大矩形
LeetCode 题目 85:最大矩形
|
6月前
|
存储 SQL 算法
LeetCode面试题84:柱状图中最大的矩形
LeetCode面试题84:柱状图中最大的矩形
|
7月前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
49 3
|
7月前
代码随想录Day51 完结篇 LeetCode T84 柱状图的最大矩形
代码随想录Day51 完结篇 LeetCode T84 柱状图的最大矩形
41 0
|
7月前
|
算法 测试技术 C#
【单调栈】【区间合并】LeetCode85:最大矩形
【单调栈】【区间合并】LeetCode85:最大矩形