1. 题目

给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。

示例:
输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2
解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,
且 2 是不超过 k 的最大数字(k = 2)。说明:
矩阵内的矩形区域面积必须大于 0。
如果行数远大于列数,你将如何解答呢?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-sum-of-rectangle-no-larger-than-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

最好在做本题之前,先把下面链接题目读懂

程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)

  • 本题说行比较多,那么按列来压扁,两重循环,遍历所有的列组合
  • 对每种列组合,压扁后的 m (行数)个和,先求最大子序和(按照上题方法)
  • 如果最大连续子序和 == k,返回 k,< k 进行下一个组合
  • 如果子序和 > k ,那还需要找是否有 <= k 的呢?将前缀和 prefix 插入set(初始有0,防止prefix 一开始就是 k 的情况)
  • 二分查找 prefix-k 的下限 lb,如果存在,则lb >= prefix-k, 两个前缀和做差就是连续子序列的和 SUM = prefix - lb <= k,更新最大值
class Solution {public:int maxSumSubmatrix(vector<vector<int>>& mat, int k) {if(mat.empty() || mat[0].empty())return 0;int m = mat.size(), n = mat[0].size(), i, j1, j2;int sum, tempmax, maxsum = INT_MIN, prefix;vector<int> sumCols(m);for(j1 = 0; j1 < n; ++j1){sumCols.clear();sumCols.resize(m);for(j2 = j1; j2 < n; ++j2){  //列的左右边界组合for(i = 0; i < m; ++i)sumCols[i] += mat[i][j2];//行向求和sum = tempmax = INT_MIN;           for(i = 0; i < m; ++i){   //对上面的和,求最大连续子序列和,DPif(sum > 0)sum += sumCols[i];elsesum = sumCols[i];tempmax = max(sum, tempmax);//临时的最大子序列和if(sum <= k)//更新答案maxsum = max(maxsum, sum);}if(tempmax == k || maxsum==k)return k;//找到上限直接返回if(tempmax < k)//最大连续子序列和小于 k,进行下一轮continue;//最大连续子序列和 大于 k,还要继续查找 有可能 <= k 的set<int> s;s.insert(0);//第一个就是k的时候,可以找到prefix = 0;//利用前缀和,在set中二分查找for(i = 0; i < m; ++i){prefix += sumCols[i];auto it = s.lower_bound(prefix-k);s.insert(prefix);if(it != s.end()){int SUM = prefix-(*it);if(SUM > maxsum)maxsum = SUM;}if(maxsum == k)return k;}}}return maxsum;}
};

60 ms 9.3 MB

LeetCode 363. 矩形区域不超过 K 的最大数值和(DP+set二分查找)相关推荐

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

    给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和. 题目数据保证总会存在一个数值和不超过 k 的矩形区域. 示例 1: 输入:matr ...

  2. [C++Rust]LeetCode No.363 矩形区域不超过 K 的最大数值和

    原贴地址:http://blog.leanote.com/post/dawnmagnet/363 题目 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 ...

  3. leetcode 363. Max Sum of Rectangle No Larger Than K | 363. 矩形区域不超过 K 的最大数值和(前缀和,图文详解)

    题目 https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/ 题解 本题利用 前缀和 的思想. 首先,分别建立横向.纵 ...

  4. 365天挑战LeetCode1000题——Day 117 矩形区域不超过 K 的最大数值和

    363. 矩形区域不超过 K 的最大数值和 代码实现 class Solution {public:int maxSumSubmatrix(vector<vector<int>> ...

  5. 【数据结构与算法】之深入解析“矩形区域不超过K的最大数值和”的求解思路与算法示例

    一.题目要求 给你一个 m x n 的矩阵 matrix 和一个整数 k,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和. 题目数据保证总会存在一个数值和不超过 k 的矩形区域. 示例 1: 输 ...

  6. LeetCode 1150. 检查一个数是否在数组中占绝大多数(二分查找)

    文章目录 1. 题目 2. 解题 2.1 暴力 2.2 二分查找 1. 题目 给出一个按 非递减 顺序排列的数组 nums,和一个目标数值 target. 假如数组 nums 中绝大多数元素的数值都等 ...

  7. LeetCode 658. 找到 K 个最接近的元素(二分查找)

    1. 题目 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先选择数值较小的那个数. ...

  8. leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)

    题目 https://leetcode.com/problems/find-k-closest-elements/ 题解 在arr中找到第一个小于等于x的位置mid,然后再根据题意,用双指针分别向左. ...

  9. 【51Nod - 1094】和为k的连续区间 (前缀和,二分查找)

    题干: 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间i,ji,j,(1 <= i <= j <= n),使得aii + ... + ajj = ...

最新文章

  1. 多线程中的使用共享变量的问题
  2. IEDA与activiti不兼容等等安装错误问题的解决方案
  3. 基于LBS的兴趣点查询
  4. JavaScript 回调(callback)函数
  5. Matlab--sort排序
  6. 这样保养让你皮肤变水嫩 - 健康程序员,至尚生活!
  7. 软件设计师 - 算法思想
  8. CVPR 2020丨更精准的视频目标检测:基于记忆增强的全局-局部整合网络的方法
  9. python的with as语句_python with (as)语句
  10. [Android实例] 天天动听 悬浮歌词(迷你歌词)效果解读
  11. 【99JS手记】之一:nth-child选择器
  12. Web服务器 之 关于Apache (httpd)服务器防DDOS模块mod_evasive的使用说明
  13. 在html用微信跳转,H5如何跳转微信小程序?
  14. Word中插入分隔线
  15. 中柏平板bios对照表_BIOS详解及中英文对照表
  16. python中的箭头符号
  17. 做一个靠谱的软件测试工程师:进行有效地沟通
  18. LCM5369 降压控制器 P2P替代TPS536C9
  19. 腾讯研究院夹缝中生存 35万年薪难求才
  20. 芋道 Spring Boot JPA 入门(一)之快速入门

热门文章

  1. Python如何生成windows可执行的exe文件
  2. 大数据集群搭建之节点的网络配置过程(二)
  3. struct cdev结构体和cdev_init和cdev_add函数
  4. opencv双目视觉标定、匹配和测量 (附代码)
  5. 数据结构探险——树篇
  6. mysql备份到带库_RMAN备份恢复——备份到带库的性能
  7. 使用docker 起容器配置负载均衡(加权)
  8. Django form choices, placeholder
  9. scp和sftp常用操作
  10. DirectX API 编程起步 #01 项目设置