【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和
【JavaScript】Leetcode每日一题-矩形区域不超过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
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-100 <= matrix[i][j] <= 100
-10^5 <= k <= 10^5
【分析】
太难了,学到了很多,根据大神们的讨论,这应该是比较有代表的一类题,即二维矩形内部矩形区域值之和的相关问题。
不说了,上代码
// 在数组 arr 中,求不超过 k 的最大值
var dpmax = function(arr, k) {
var rollSum = arr[0], rollMax = rollSum;
// O(rows)
for (var i = 1; i < arr.length; i++) {
if (rollSum > 0) rollSum += arr[i];
else rollSum = arr[i];
if (rollSum > rollMax) rollMax = rollSum;
}
if (rollMax <= k) return rollMax;
// O(rows ^ 2)
var max = -1000001;
for (var l = 0; l < arr.length; l++) {
var sum = 0;
for (var r = l; r < arr.length; r++) {
sum += arr[r];
if (sum > max && sum <= k) max = sum;
if (max == k) return k; // 尽量提前
}
}
return max;
} var maxSumSubmatrix = function(matrix, k) {
var rows = matrix.length, cols = matrix[0].length, max = -1000001;
// O(cols ^ 2 * rows)
for (var l = 0; l < cols; l++) { // 枚举左边界
var rowSum = new Array(rows).fill(0); // 左边界改变才算区域的重新开始
for (var r = l; r < cols; r++) { // 枚举右边界
for (var i = 0; i < rows; i++) { // 按每一行累计到 dp
rowSum[i] += matrix[i][r];
}
max = Math.max(max, dpmax(rowSum, k));
if (max == k) return k; // 尽量提前
}
}
return max;
};
时间复杂度:\(O(cols^2*rows^2)\)

思路是
大神的数组滚动,大神们的题解已经写的很具体了,自己就签到一下吧。
官方题解思路差不多,差别在对一维数组求最大值时使用的有序集合,时间复杂度为\(O(log(n))\),总时间复杂度为\(O(m^2nlog(n))\)。
最后,自己不解的是,二维转一维时间复杂度为\(O(cols^2*rows^2)\)与暴力相同,为什么时间复杂度这么大……有人能告诉我一下嘛?
暴力(朴素dp
暴力解法即使使用了dp,但时间复杂度还是是硬核的\(O(m^2*n^2)\)。
var maxSumSubmatrix = function(matrix,k) {
var rows = matrix.length, cols = matrix[0].length, max = -1000001;
for (var i1 = 1; i1 <= rows; i1++) {
for (var j1 = 1; j1 <= cols; j1++) {
var dp = new Array(rows+1);
for(var i=0;i<rows+1;i++){
dp[i] = new Array(cols+1).fill(0);
}
dp[i1][j1] = matrix[i1 - 1][j1 - 1];
for (var i2 = i1; i2 <= rows; i2++) {
for (var j2 = j1; j2 <= cols; j2++) {
dp[i2][j2] = dp[i2 - 1][j2] + dp[i2][j2 - 1] - dp[i2 - 1][j2 - 1] + matrix[i2 - 1][j2 - 1];
if (dp[i2][j2] <= k && dp[i2][j2] > max) max = dp[i2][j2];
if(max == k) return max;
}
}
}
}
return max;
}

前缀和+二分
前缀和也是这次学习知道的名词,前缀和指二维数组从(0,0)到(x,y)矩阵的元素和,因此也是一个二维数组。
题解见三叶姐姐题解。
【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和的更多相关文章
- Leetcode 363.矩形区域不超过k的最大数值和
矩形区域不超过k的最大数值和 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,-2,3]], ...
- Java实现 LeetCode 363 矩形区域不超过 K 的最大数值和
363. 矩形区域不超过 K 的最大数值和 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,- ...
- [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. 矩形区域不超过 K 的最大数值和(利用前缀和转化为最大子序和问题)
题目: 链接:https://leetcode-cn.com/problems/max-sum-of-rectangle-no-larger-than-k/ 给定一个非空二维矩阵 matrix 和一个 ...
- 【JavaScript】Leetcode每日一题-在D天内送包裹的能力
[JavaScript]Leetcode每日一题-在D天内送包裹的能力 [题目描述] 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i] ...
- 【JavaScript】Leetcode每日一题-青蛙过河
[JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【JavaScript】Leetcode每日一题-递增顺序搜索树
[JavaScript]Leetcode每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...
随机推荐
- 【vscode】【python】自定义代码自动补全
引自:https://blog.csdn.net/Kyrielong/article/details/88058884 { "python.jediEnabled": true, ...
- CF533F Encoding 题解
题目链接CF533F Encoding 提示1: \(\mathcal O(26^2*n)\) 的算法可通过.常用的几种字符串匹配算法kmp,AC自动机,哈希都可以解决该问题 (后两者可以优化到 ...
- wget 爬取网站网页
相应的安装命名 yum -y install wget yum -y install setup yum -y install perl wget -r -p -np -k -E http:// ...
- C/C++ 性能优化背后的方法论:TMAM
开发过程中我们多少都会关注服务的性能,然而性能优化是相对比较困难,往往需要多轮优化.测试,属于费时费力,有时候还未必有好的效果.但是如果有较好的性能优化方法指导.工具辅助分析可以帮助我们快速发现性能瓶 ...
- Simulink中Scope数据保存至Workspace制图
0 问题 通常情况下,仿真模型中scope波形可编辑程度并不高,尽管高版本MATLAB中已经可以将其直接导出到figure,但效果并不是特别理想.在需要高质量输出波形图场合,就需要将其中数据导出到wo ...
- Pyinstaller原理详解
Pyinstaller原理详解 什么是Pyinstaller Pyinstaller可以把Python程序打包成exe文件,可以在没有Python的电脑上运行,主要用于生产用. Python.h! 在 ...
- Day09_41_集合_Set
Set集合 Set集合 - Set集合的特点是无序不可重复.Set集合类似于一个罐子,程序可以依次把多个对象"丢进"Set集合,而Set集合通常不能记住元素的添加顺序. - Set ...
- 超详细!!Spring5框架开发笔记
Spring5开发教程 简介 spring特性 sping是轻量级的开源的JavaEE框架 Spring可以解决企业应用开发的复杂性 Sping两个核心的部分:IOC和AOC IOC:控制反转.把创建 ...
- CPF 入门教程 - 控件布局(六)
CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...
- Python 3.10 中新的功能和变化
随着最后一个alpha版发布,Python 3.10 的功能更改全面敲定! 现在,正是体验Python 3.10 新功能的理想时间!正如标题所言,本文将给大家分享Python 3.10中所有重要的功能 ...