https://leetcode-cn.com/problems/max-sum-of-rectangle-no-larger-than-k/
题意:给你一个二维矩阵。让你找出其中一个子矩阵,使得其和最大,且不超过k。(行数远大于列数)
思路:
方法一:二维前缀和 + 暴力枚举
最直观的方法:枚举矩阵左上角,右下角。O(1) 查询区间和。
方法二:将矩阵转换成为m^2个线性序列
枚举列的左边界和右边界。然后利用前缀和优化将其转换成序列形式.
这样以来,等于是说对于这n^2个线性序列,找出序列中最大的不超过k的字段和.
方法如下:
所以可以使用set动态存储所有前缀和,枚举右端点,lower_bound查询即可。
算法优化:
第一点时间优化:由于行数远大于列数,所以枚举时肯定是选择m^2,而不是n^2
第二点时间优化: 先直接求最大字段和,若最大字段和 <= k 。那么直接用这个答案。可以剪枝掉很多情况.
第三点空间优化:如果利用二维前缀和,浪费空间,过不去mle.那么考虑使用滚动数组. 观察指针i,j移动的方式,可以将空间优化到O(n),但是需要在内层循环j指针移动的时候去维护和。
.