【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每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...
随机推荐
- TiDB在更新版本的时候初始化Prometheus的配置文件失败
一.背景是更换版本了之后,按照正常扩容节点也会报错. 我们安装的TiDB版本是v4.0.0,因为环境还在试用阶段,所以会经常增删节点.原因是我们违背官方说明,强行用机械盘上了,跑不过单机的mysql, ...
- 记录一个在配置虚拟环境是遇到的错误(virtualenv)
原配置文件 export WORKON_HOME=~/Envs #设置virtualenv的统一管理目录 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no- ...
- 从一部电影史上的趣事了解 Spring 中的循环依赖问题
title: 从一部电影史上的趣事了解 Spring 中的循环依赖问题 date: 2021-03-10 updated: 2021-03-10 categories: Spring tags: Sp ...
- Java流程控制:增强for循环,break&continue,打印99乘法表
增强for循环:java5引入了一种主要用于数组或集合的增强for循环for(声明语句:表达式){//代码句子} 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配.其作用域限定在循环语 ...
- Shuffle Card HDU - 6707
题目链接:https://vjudge.net/problem/HDU-6707 题意:给你一个数组a[ ](a[1]=1,a[2]=2.....a[n]=n),然后m次操作,每次把那个数拿到最前面去 ...
- ch1_6_2求解删除公共字符问题
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成&q ...
- 创建Maven父子项目以及它们的优点
此文引用:https://blog.csdn.net/zxl8876/article/details/104180133 创建maven父子项目 第一步创建父项目: 新建一个普通的maven项目 删除 ...
- Hi3559AV100 NNIE开发(6)RFCN中NNIE实现关键线程函数->SAMPLE_SVP_NNIE_Rfcn_ViToVo()进行数据流分析
前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...
- GitlabCI/CD&Kubernetes项目交付流水线实践
GitlabCI实践 GitLabCI/CD基础概念 为什么要做CI/CD? GitLab CI/CD简介 GitLabCI VS Jenkins 安装部署GitLab服务 GitLabRunner实 ...
- Dynamics CRM使用Web Api时如果参数里面包含"&"的时候的处理方法
当我们使用Dynamics CRM的Api的时候如果遇到查询字段的参数里面有&符号的话会影响Api的取值直接报错.原因是因为&符号在Url上面是一个关键字,这个关键字可以截断Url表示 ...