C++前缀和算法应用:矩形区域不超过 K 的最大数值和

基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例

题目

给你一个 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
-105 <= k <= 105

分析

二维前缀和

vPreSum[r][c] 记录以(0,0)开始,宽高为c r的矩形和。vPreSum[r][c] = vPreSum[r - 1][c] + vPreSum[r][c - 1] + matrix[r - 1][c - 1] - vPreSum[r - 1][c - 1];
在这里插入图片描述

vPreSum[r - 1][c]绿色实心矩形的和
vPreSum[r][c - 1]蓝色空心矩形
matrix[r - 1][c - 1]黄色矩形
vPreSum[r - 1][c - 1]蓝绿重叠部分

时间复杂度O(nnn*logn)

枚举所有矩形,时间复杂度是O(n^4),超时。三层循环,第一层和第二层循环,枚举左右。第三层循环枚举下,setSum记录了所有合法的t的构成的矩形(left,0,right,t-1)的和。显然iLeftRight - setSum任意元素的值,就是(left,t,right,row)矩形的和。iLeftRight 是矩形(left,0,right,row)的和。对setSum 进行二分。

源码

class Solution {
public:
int maxSumSubmatrix(vector<vector>& matrix, int k) {
m_r = matrix.size();
m_c = matrix.front().size();
vector<vector> vPreSum(m_r+1,vector(m_c+1,0)); //vPreSum[r][c] 以(0,0)开始,宽高为c r的矩形
for (int r = 1; r <= m_r; r++)
{
for (int c = 1; c <= m_c; c++)
{
//令r=1,c=1 vPreSum[1][1] = 0 +0 + matrix[0][0] -0
//令r=2,c=2 vPreSum[2][2] = vPreSum[1][2] +vPreSum[2][1] + matrix[1][1] + vPreSum[1][1]
vPreSum[r][c] = vPreSum[r - 1][c] + vPreSum[r][c - 1] + matrix[r - 1][c - 1] - vPreSum[r - 1][c - 1];
}
}
int iMin = INT_MIN;
//vector<vector> vDebug(m_r, vector(m_c,INT_MIN));
for (int left = 0; left < m_c ; left++ )
{
for (int right = left ; right < m_c; right++ )
{
//row和right 是右下角的坐标
set setSum = { 0 };
for (int row = 0; row < m_r; row++)
{
const int iLeftRight = vPreSum[row + 1][right + 1]

  • vPreSum[row + 1][left];
    //iLeftRight - x <=k ==> -x <= k - iLeftRight ==> x >= iLeftRight-k
    auto it = setSum.lower_bound(iLeftRight - k);
    if (setSum.end() != it)
    {
    iMin = max(iMin, iLeftRight - *it);
    //vDebug[row][right] = iLeftRight - *it;
    }
    setSum.emplace(iLeftRight);
    }
    }
    }
    return iMin;
    }
    int m_r, m_c;
    };

测试用例

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
assert(v1[i] == v2[i]);
}
}

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}
int main()
{
vector<vector> matrix = { {1, 2, 3}, { 4,5,6 } };
int k = 2;
auto res = Solution().maxSumSubmatrix(matrix, k);
Assert(res, 2);
matrix = { {1, 0, 1}, { 0,-2,3 } };
k = 2;
res = Solution().maxSumSubmatrix(matrix, k);
Assert(res, 2);
matrix = { {2,2,-1} };
k = 3;
res = Solution().maxSumSubmatrix(matrix, k);
Assert(res, 3);
CConsole::Out(res);
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

鄙人想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码坏味道

"坏味道"是指代码中存在一些不佳的编程实践或设计问题&#xff0c;可能会导致代码难以维护、理解或扩展。以下是一些常见的C#代码"坏味道"和如何解决它们的建议&#xff1a; 1. **过于复杂的方法&#xff1a;** 当一个方法过于庞大&#xff0c;包含太多的…

机器学习-概述与贝叶斯算法

机器学习的一般步骤&#xff1a;数据搜集、数据清洗、特征工程、数学建模。数据划分&#xff1a;训练集、验证集、测试集。K折交叉验证&#xff1a;解决数据量不够大问题&#xff0c;解决参数调优问题。深度学习不用做特征工程&#xff0c;传统机器学习要。损失函数&#xff0c…

深圳寄包裹到德国

深圳&#xff0c;作为全球最发达的城市之一&#xff0c;以其高效的物流服务在全球范围内享有盛名。如果你正在寻找一种方式将包裹从深圳寄送到德国&#xff0c;那么本文将为你提供详细的步骤和建议。 第一步&#xff1a;了解国际邮寄的基本信息 首先&#xff0c;你需要了解包裹…

Bitquiz重塑Learn to Earn热潮,用户零投入让学习创造价值

Axie 带来的暴富效应、StepN 带来的出圈效应&#xff0c;近期Bigtime 在熊市中的大火&#xff0c;为加密参与者带来的赚取效应&#xff0c;X to Earn 重新成为整个市场关注的重点&#xff0c;GameFi 再次站在了风口浪尖。 大家开始寻找下一个Bigtime&#xff0c;希望能够抓住一…

Python源码格式转换

1.文件格式侦测 - file 命令 [rootlocalhost sensor]# find stress/*| xargs file stress/bi: directory stress/bi/dynamic_cycles.py: UTF-8 Unicode text, with CRLF line …

低代码技术这么香,如何把它的开发特点发挥到极致?

前言 什么是低代码技术&#xff1f; 低代码是一种可视化软件开发方法&#xff0c;通过最少的编码更快地交付应用程序。图形用户界面和拖放功能使开发过程的各个方面自动化&#xff0c;消除了对传统计算机编程方法的依赖。 文章目录 前言低代码平台怎么选&#xff1f;用友Yonbu…

压缩炸弹,Java怎么防止

一、什么是压缩炸弹&#xff0c;会有什么危害 1.1 什么是压缩炸弹 压缩炸弹(ZIP)&#xff1a;一个压缩包只有几十KB&#xff0c;但是解压缩后有几十GB&#xff0c;甚至可以去到几百TB&#xff0c;直接撑爆硬盘&#xff0c;或者是在解压过程中CPU飙到100%造成服务器宕机。虽然…

JOSEF约瑟 多档切换式漏电(剩余)继电器JHOK-ZBL1 30/100/300/500mA

系列型号&#xff1a; JHOK-ZBL多档切换式漏电&#xff08;剩余&#xff09;继电器&#xff08;导轨&#xff09; JHOK-ZBL1多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL2多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBM多档切换式漏电&#xf…

Unity 3D基础——缓动效果

1.在场景中新建两个 Cube 立方体&#xff0c;在 Scene 视图中将两个 Cude的位置错开。 2.新建 C# 脚本 MoveToTarget.cs&#xff08;写完记得保存&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class MoveToTarget : M…

Netty使用SslHandler实现加密通信-单向认证篇

引入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.100.Final</version> </dependency>生成keystore.jks文件 keytool -genkeypair -alias your_alias -keyalg RSA -keysto…

系统与运维安全管理制度

1、总则 1.1、目的 为推动XXXXX单位系统安全管理的规范化、程序化、制度化&#xff0c;应按信息系统安全等级保护的相关要求&#xff0c;依据系统的保护等级&#xff0c;落实各系统各项的防护措施&#xff0c;进一步加强系统安全性&#xff0c;保障信息网络的安全、稳定运行&…

对工作还有Bar Raiser的一些感想

最近更新博客的频率降低了&#xff0c;很大一个原因是工作内容发生了变化&#xff0c;之前工作内容大数据开发占比较高。而现在的工作内容后端开发占比会更加多一点&#xff0c;比如 Spring全家桶、DDD 。而对技术没有深入的使用和研究&#xff0c;很难产出高质量的文章&#x…

在React中引用CSS方式及写法大全

文章目录 引用方式第一种&#xff1a;内联方式第二种&#xff1a;在组件引用 [name] .css文件第三种&#xff1a;在组件中引用[name] .scss文件第四种&#xff1a;在组件中引用[name].module.css文件 写法三种内联写法三元表达式引用module.css 引用方式 第一种&#xff1a;内…

定档通知2024中国(上海)国际品牌叉车展览会

时 间&#xff1a;2024年7月24&#xff5e;26日 地 点&#xff1a;上海国家会展中心 ◆ 》》》展会概况&#xff1a; 叉车在“搬运设备”中扮演着非常重要的角色&#xff0c;是机械化装卸、堆垛和短距离运输的高效设备。近年来&#xff0c;在“节能环保&#xff0c…

EF Core 7.0 新特性之批量修改

概要 EF Core 7.0 提供了一个可以将LINQ查询和批量修改相结合的方法ExecuteUpdate。由于数据修改是以批量更新的方式完成&#xff0c;所以可以减少数据库的往返次数。 本文将主要介绍ExecuteUpdate的使用方法。 代码和实现 基本案例 本文我们使用银行分行&#xff0c;ATM机…

GlobalTransactional

seata-spring的maven坐标&#xff1a; <dependency><groupId>io.seata</groupId><artifactId>seata-spring</artifactId><version>1.6.1</version> </dependency>GlobalTransactional注解的位置&#xff1a; io.seata.sprin…

SystemC入门学习-第8章 测试平台的编写

之前的章节&#xff0c;一直把重点放在用SystemC来描述硬件电路上&#xff0c;即如何编写SystemC 的RTL。本章的注意力集中在验证和编写测试平台上。 重点包括&#xff1a; 如何生成时钟信号和激励波形如何编写有响应能力的测试平台如何记录仿真结果 8.1 编写测试平台 测试平…

pytorch中的归一化函数

在 PyTorch 的 nn 模块中&#xff0c;有一些常见的归一化函数&#xff0c;用于在深度学习模型中进行数据的标准化和归一化。以下是一些常见的归一化函数&#xff1a; nn.BatchNorm1d, nn.BatchNorm2d, nn.BatchNorm3d&#xff1a; 这些函数用于批量归一化 (Batch Normalization…

论文阅读:Rethinking Range View Representation for LiDAR Segmentation

来源ICCV2023 0、摘要 LiDAR分割对于自动驾驶感知至关重要。最近的趋势有利于基于点或体素的方法&#xff0c;因为它们通常产生比传统的距离视图表示更好的性能。在这项工作中&#xff0c;我们揭示了建立强大的距离视图模型的几个关键因素。我们观察到&#xff0c;“多对一”…

JOSEF约瑟 漏电继电器 JD1-200 工作电压:380V 孔径:45mm 50~500mA

JD1系列漏电继电器 系列型号 JD1-100漏电继电器 JD1-200漏电继电器 JD1-250漏电继电器 JD1系列漏电继电器原为分体式固定式安装&#xff0c;为适应现行安装场合需要&#xff0c;上海约瑟继电器厂在产品原JD1一体式漏电继电器基础上进行产品升级&#xff0c;开发出现在较为…