【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每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...
随机推荐
- 基于Linux的tty架构及UART驱动详解
更多嵌入式Linux原创,请关注公众号:一口Linux 一.模块硬件学习 1.1. Uart介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitt ...
- WPF 应用 - 通过 js 缩放 System.Windows.Controls.WebBrowser 的内容
1. 前提 原本是在大屏上展示系统,系统有个功能是加载第三方的网站,第三方网站按照大屏的分辨率写死了宽高: 现需要改到小屏展示系统,而这个第三方的网站不能随着 WebBrowser 窗口的尺寸调整网站 ...
- 最权威最简明的maven 使用教程
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Depen ...
- Java8的新特性--Optional
目录 Optional 一.Optional类是什么? 二.Optional类常用的方法 1. 创建Optional实例 1.1 Optional.of(T) 1.2 Optional.empty() ...
- 简要说一下.Net的编译过程.
看面试题的时候遇到这样一道题目,简要说明.NET的编译过程,在网上看了很多资料,简单总结如下: 1.一般的编译过程 通常高级语言的程序编译过程是:首先写好的程序是源代码,然后编译器编译为本地机器语言, ...
- 攻防世界 reverse BABYRE
BABYRE XCTF 4th-WHCTF-2017 int __cdecl main(int argc, const char **argv, const char **envp) { char ...
- 半监督学习方法(Semi-supervised Learning)的分类
根据模型的训练策略划分: 直推式学习(Transductive Semi-supervised Learning) 无标记数据就是最终要用来测试的数据,学习的目的就是在这些数据上取得最佳泛化能力. 归 ...
- Java例题_26 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
1 /*26 [程序 26 求星期] 2 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 3 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情 ...
- Redis 超详细自动管理Cluster集群工具上手 redis-trib.rb (多图,手把手)
安装介绍 redis-trib.rb是一款由Redis官方提供的集群管理工具,能够大量减少集群搭建的时间. 除此之外,还能够简化集群的检查.槽迁徙.负载均衡等常见的运维操作,但是使用前必须要安 ...
- MRCTF My secret
My secret 知识点:wireshark基本操作,shadowsocks3.0源码利用,拼图(os脚本编写能力), 根据这里的信息可以知道,tcp所传输的源数据是在target address后 ...