Leetcode: Max Sum of Rectangle No Larger Than K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix such that its sum is no larger than k. Example:
Given matrix = [
[1, 0, 1],
[0, -2, 3]
]
k = 2
The answer is 2. Because the sum of rectangle [[0, 1], [-2, 3]] is 2 and 2 is the max number no larger than k (k = 2). Note:
The rectangle inside the matrix must have an area > 0.
What if the number of rows is much larger than the number of columns?
Reference: https://discuss.leetcode.com/topic/48875/accepted-c-codes-with-explanation-and-references/2
The naive solution is brute-force, which is O((mn)^2). In order to be more efficient, I tried something similar to Kadane's algorithm. The only difference is that here we have upper bound restriction K.
First, How to find the max sum rectangle in 2D array? The naive way is O(N^4)
Here's the easily understanding video link for the problem "find the max sum rectangle in 2D array": Maximum Sum Rectangular Submatrix in Matrix dynamic programming/2D kadane , O(N^3), the idea is select left edge l and right edge r, together with top edge 0 and bottom edge n, form a subrectangle area, (O(N^2)), find the local max sum in this subrectangle, just like max sum subarray(O(N). So the total time complexity is O(N^3), space complexity is O(N).
Once you are clear how to solve the above problem, the next step is to find the max sum no more than K in an array. This can be done within O(nlogn), and you can refer to this article: max subarray sum no more than k.
You can do this in O(nlog(n))
First thing to note is that sum of subarray (i,j] is just the sum of the first j elements less the sum of the first i elements. Store these cumulative sums in the array cum. Then
the problem reduces to finding i,j such that i<j and cum[j]−cum[i] is as close to k but lower than it.
To solve this, scan from left to right. Put the cum[i] values that you have encountered till now into a set. When you are processing cum[j] what you need to retrieve from the set is the smallest number in the set such which is bigger than cum[j]−k. This lookup can be done in O(logn) using upper_bound. Hence the overall complexity is O(nlog(n)).
This can be done using TreeSet.
For the solution below, I assume that the number of rows is larger than the number of columns. Thus in general time complexity is
O[min(m,n)^2 * max(m,n) * log(max(m,n))], space O(max(m, n)).
假设col<row,下面的意思就是维护一个size为row的 sum数组。 每次iteration这个sum数组用来存某几个col叠加在一起的和(就是某一个rectangle的sum),然后在其中用treeSet找出当前最大的rectangle sum,时间复杂度是row*(log(row)). 所有iteration完成就得到最终答案,iteration数目是O(col^2), 所以总时间复杂度是O(col^2*row*log(row))。
例子:
1 2 3
4 5 6
7 8 9
假如现在i = 0, j=1, 那么当前subrectangle是[[1, 2], [4, 5], [7, 8]], 于是int[] sum就是[[1+2], [4+5], [7+8]] = [[3], [9], [15]], val是这个sum数组的preSum, 依次取的值是3, 3+9=12, 3+9+15=27, 所以TreeSet里面依次被加入0,3,12,27. 假设k=16,那么到27的时候,set里面是0,3,12,存在比27-16=11大的值是12,说明存在不大于k=16的最大subrectangle area = 27-12=15
Time Complexity: O[min(m,n)^2 * max(m,n) * log(max(m,n))], space O(max(m, n)). compare to naive solution time complexity O((mn)^2)
same as Leetcode: Number of Submatrices That Sum to Target
public class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
if (matrix==null || matrix.length==0 || matrix[0].length==0) return Integer.MIN_VALUE;
int res = Integer.MIN_VALUE;
int row = matrix.length;
int col = matrix[0].length;
int m = Math.min(row, col);
int n= Math.max(row, col);
boolean moreCol = col > row;
for (int i=0; i<m; i++) {
int[] sum = new int[n];
for (int j=i; j<m; j++) {
TreeSet<Integer> set = new TreeSet<Integer>();
int val = 0; //sum array's preSum
set.add(0);
for (int l=0; l<n; l++) {
sum[l] += moreCol? matrix[j][l] : matrix[l][j];
val += sum[l];
Integer oneSum = set.ceiling(val-k);
if (oneSum != null) {
res = Math.max(res, val-oneSum);
}
set.add(val);
}
}
}
return res;
}
}
Leetcode: Max Sum of Rectangle No Larger Than K的更多相关文章
- [LeetCode] Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- 363. Max Sum of Rectangle No Larger Than K
/* * 363. Max Sum of Rectangle No Larger Than K * 2016-7-15 by Mingyang */ public int maxSumSubmatri ...
- [LeetCode] 363. Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- 【LeetCode】363. Max Sum of Rectangle No Larger Than K 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/max-sum- ...
- 【leetcode】363. Max Sum of Rectangle No Larger Than K
题目描述: Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the ma ...
- [Swift]LeetCode363. 矩形区域不超过 K 的最大数值和 | Max Sum of Rectangle No Larger Than K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- 363 Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- Max Sum of Rectangle No Larger Than K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- LeetCode 363:Max Sum of Rectangle No Larger Than K
题目链接 链接:https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1 ...
随机推荐
- Memcached原理深度分析详解
Memcached是 danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东 西,相信很多人都用过,本文意在通 ...
- WSDL Style和use的组合方式说明
原文地址:http://www.ibm.com/developerworks/cn/webservices/ws-whichwsdl/#listing9 use属性可以为literal,encoded ...
- 运维技能大全 | Devops Tools 周期表
老外整理的 Devops Tools 周期表,可以用酷炫屌炸天形容,划分了数据库.CI.日志.安全.监控.配置管理.云服务等15个大类,120个工具.我是有点孤陋寡闻,很多都没听说过,你要是全学会了你 ...
- 分页查询:使用分页类查询 用get传值
<body> <?php $cx = ""; if(!empty($_GET["cx"])) //判断get传过来的值非空,那么把传过来的值赋 ...
- IOS 入门开发教程
object-c: http://mobile.51cto.com/iphone-261129.htm Objective-C入门教材 Objective-C入门教材 2011-05-11 15:58 ...
- C、VDD、VSS、 VEE 和VPP的区别
http://www.cnblogs.com/crazybingo/archive/2010/05/14/1735802.html C.VDD.VSS. VEE 和VPP的区别 在电子电路中,常可以看 ...
- mysql integer size 大小
I was always wondering what the size of numeric columns in MySQL was. Forgive me if this is obvious ...
- 查询数据表,去除符合某些条件的记录,没有自动增长列(not exists)
select distinct ccode,isnull(cexch_name,''),N'',N'',N'2014.03',0,1,1,1,12 from RP_bankrecp where not ...
- Keep Alive
跳板机时经常出现连接被断开的情况.如果发生这种情况,请在客户端配置Keep Alive设置,具体方法参考如下: Windows: secureCRT:Properties -> Terminal ...
- dubbo的简单使用
整个过程大致是这样的 1.注册中心使用zookeeper,地址为192.168.192.128:2181! 2.首先服务方 所在的服务器是127.0.0.1:8081 服务方提供的接口: public ...