【LeetCode】363. Max Sum of Rectangle No Larger Than K 解题报告(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址: https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/
题目描述:
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:
Input: matrix = [[1,0,1],[0,-2,3]], k = 2
Output: 2
Explanation: 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?
题目大意
找出一个矩阵中的子长方形,使得这个长方形的和是最大的。
解题方法
方法一:暴力求解(TLE)
求和最大的矩形,很容易让人想到先把(0, 0)到所有(i, j)位置的矩形的和求出来,然后再次遍历,求出所有子矩形中和最大的那个。
很无奈,超时了。(好像C++可以通过,python伤不起)
时间复杂度是O((MN)^2),空间复杂度是O(MN)。
class Solution(object):
def maxSumSubmatrix(self, matrix, k):
"""
:type matrix: List[List[int]]
:type k: int
:rtype: int
"""
if not matrix or not matrix[0]: return 0
M, N = len(matrix), len(matrix[0])
sums = [[0] * N for _ in range(M)]
res = float("-inf")
for m in range(M):
for n in range(N):
t = matrix[m][n]
if m > 0:
t += sums[m - 1][n]
if n > 0:
t += sums[m][n - 1]
if m > 0 and n > 0:
t -= sums[m - 1][n - 1]
sums[m][n] = t
for r in range(m + 1):
for c in range(n + 1):
d = sums[m][n]
if r > 0:
d -= sums[r - 1][n]
if c > 0:
d -= sums[m][c - 1]
if r > 0 and c > 0:
d += sums[r - 1][c - 1]
if d <= k:
res = max(res, d)
return res
方法二:Kadane’s algorithm (TLE)
看了印度小哥的视频,真的很好理解,告诉我们使用一个数组的情况下,如何找出整个二维子矩阵的最大值。我看了视频之后,写出了这个算法,但是很无奈,直接用这个算法仍然超时。
我分析,这个算法时间复杂度仍然没有降下来,主要问题是获取子数组的最大区间和这一步太耗时了。
时间复杂度是O((MN)^2),空间复杂度是O(M)。
class Solution(object):
def maxSumSubmatrix(self, matrix, k):
"""
:type matrix: List[List[int]]
:type k: int
:rtype: int
"""
if not matrix or not matrix[0]: return 0
L, R = 0, 0
curSum, maxSum = float('-inf'), float('-inf')
maxLeft, maxRight, maxUp, maxDown = 0, 0, 0, 0
M, N = len(matrix), len(matrix[0])
for L in range(N):
curArr = [0] * M
for R in range(L, N):
for m in range(M):
curArr[m] += matrix[m][R]
curSum = self.getSumArray(curArr, M, k)
if curSum > maxSum:
maxSum = curSum
return maxSum
def getSumArray(self, arr, M, k):
sums = [0] * (M + 1)
for i in range(M):
sums[i + 1] = arr[i] + sums[i]
res = float('-inf')
for i in range(M):
for j in range(i + 1, M + 1):
curSum = sums[j] - sums[i]
if curSum <= k and curSum > res:
res = curSum
return res
方法二:Kadane’s algorithm + 二分查找 (Accepted)
上面的算法慢就慢在查找子数组的最大和部分。其实没必要使用求最大和的方式。因为题目要求我们找出不超过K的和,所以只需要在数组中是否存在另外一个数使得两者的差不超过K即可。这个查找的效率能达到O(NlogN).
在C++中能使用set和lowwer_bound实现,在python中使用bisect_left函数能也实现。
这个过程可以在这个文章中看到更详细的说明。
在时间复杂度中可以看到M影响更大,另外一个优化的策略是重新设置矩形的长和宽,这样也可以优化速度。
时间复杂度是O(MNMlogM),空间复杂度是O(M)。
class Solution(object):
def maxSumSubmatrix(self, matrix, k):
"""
:type matrix: List[List[int]]
:type k: int
:rtype: int
"""
m = len(matrix)
n = len(matrix[0]) if m else 0
M = max(m, n)
N = min(m, n)
ans = None
for x in range(N):
sums = [0] * M
for y in range(x, N):
slist, num = [], 0
for z in range(M):
sums[z] += matrix[z][y] if m > n else matrix[y][z]
num += sums[z]
if num <= k:
ans = max(ans, num)
i = bisect.bisect_left(slist, num - k)
if i != len(slist):
ans = max(ans, num - slist[i])
bisect.insort(slist, num)
return ans or 0
参考资料:
http://bookshadow.com/weblog/2016/06/22/leetcode-max-sum-of-sub-matrix-no-larger-than-k/
http://www.cnblogs.com/grandyang/p/5617660.html
https://www.quora.com/Given-an-array-of-integers-A-and-an-integer-k-find-a-subarray-that-contains-the-largest-sum-subject-to-a-constraint-that-the-sum-is-less-than-k
https://www.youtube.com/watch?v=yCQN096CwWM&t=589s
日期
2018 年 10 月 11 日 —— 做Hard题真的很难
【LeetCode】363. Max Sum of Rectangle No Larger Than K 解题报告(Python)的更多相关文章
- [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(HARD)
Leetcode363 思路: 一种naive的算法就是枚举每个矩形块, 时间复杂度为O((mn)^2), 可以做少许优化时间复杂度可以降低到O(mnnlogm), 其中m为行数, n为列数. 先求出 ...
- 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
题目描述: Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the ma ...
- 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] 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: 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 ...
- [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 ...
- 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 ...
随机推荐
- bwa比对软件的使用以及其结果文件(sam)格式说明
一.bwa比对软件的使用 1.对参考基因组构建索引 bwa index -a bwtsw hg19.fa # -a 参数:is[默认] or bwtsw,即bwa构建索引的两种算法,两种算法都是 ...
- 试了下GoAsm
在VC里我们: #include <windows.h> DWORD dwNumberOfBytesWritten; int main() { HANDLE hStdOut = GetSt ...
- android 防止R被混淆,R类反射混淆,找不到资源ID
在Proguard.cfg中添加 -keep class **.R$* { *; }
- 快速上手git gitlab协同合作
简单记录,整理. 摘要 为方便大家快速上手Git,并使用Gitlab协同合作,特编写此手册,手册内容不会太丰富与深入.主要包含如下内容: Git 使用教程1.1 安装1.2 常用命令1.3 版本控制1 ...
- mysql死锁com.mysql.cj.jdbc.exception.MYSQLTransactionRollbackException Deadlock found when trying to get lock;try restarting transaction
1.生产环境出现以下报错 该错误发生在update操作中,该表并未建立索引,也就是只有InnoDB默认的主键索引,发生错误的程序是for循环中update. 什么情况下会出现Deadlock foun ...
- redis入门到精通系列(五):redis的持久化操作(RDB、AOF)
(一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...
- spring cloud 通过 ribbon 实现客户端请求的负载均衡(入门级)
项目结构 环境: idea:2020.1 版 jdk:8 maven:3.6.2 1. 搭建项目 ( 1 )父工程:spring_cloud_demo_parent pom 文件 <?xml v ...
- 04 - Vue3 UI Framework - 文档页
官网的首页做完了,接下来开始做官网的文档页 返回阅读列表点击 这里 路由设计 先想想我们需要文档页通向哪些地方,这里直接给出我的设计: 所属 子标题 跳转路径 文件名(*.vue) 指南 介绍 /do ...
- gitlab 备份&恢复
Gitlab 成功运行起来之后,最终的事情就是定期的备份,遇到问题后的还原. 备份配置 默认 Gitlab 的备份文件会创建在/var/opt/gitlab/backups文件夹中,格式为时间戳_日期 ...
- Tableau使用折线图和饼图的组合
一.订单日期拖拽至列-右键天(具体到年月日) 二.订单日期拖拽至筛选器-年月-随机选择一个月的数据 三.创建计算字段-LOD-销售额 {EXCLUDE[类别]:SUM([销售额])} 四.销售额和刚刚 ...