【算法 C/C++】二维前缀和
2025 - 03 - 08 - 第 70 篇
Author: 郑龙浩 / 仟濹
【二维前缀和】
文章目录
- 前缀和与差分 - 我的博客
- 前缀和(二维)
- 1 基本介绍
- (1) **`sum[i][j]` 表示什么???**
- (2) **前缀和怎么求???计算 `sum[i][j]`???**`sum[4][4]`为例
- (3) **求前缀和的特殊处理**
- (4) 通过二维前缀和数组,求子矩阵和
- (5) 求矩阵和的特判
- (6) 例题
前缀和与差分 - 我的博客
一维前缀和
【算法 C/C++】一维前缀和
一维差分
【算法 C/C++】一维差分
二维前缀和
【算法 C/C++】二维前缀和
二维差分
【算法 C/C++】二维差分
前缀和(二维)
1 基本介绍
刚开始认为很难懂,明白了以后发现其实原理不难。
(1) sum[i][j]
表示什么???
sum[i][j]
表示从原数组 arr[0][0]
到 arr[i][j]
形成的子矩阵的元素和。arr[i][j]
是该子矩阵的右下角元素。
(2) 前缀和怎么求???计算 sum[i][j]
???sum[4][4]
为例
注: 在计算前缀和之前,记得先将第一个位置的元素存入 sum[0][0]
计算前缀和有一个公式,如下:
sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + arr[i][j];
sum[4][4] = sum[4][3] + sum[3][4] - sum[3][3] + arr[4][4];
原理:
当前区域和 = 左侧区域和 + 上方区域和 - 左上重复减去的区域 + 当前元素
对式子进行拆分理解:
sum[4][4] --> (0, 0) 到 (4, 4) 的和
sum[i][j - 1] --> arr[0][0] 到 arr[4][3] 的和
sum[i - 1][j] --> arr[0][0] 到 arr[3][4] 的和
sum[i - 1][j - 1] --> arr[0][0] 到 arr[3][3] 的和
arr[i][j] --> arr[i][j] 元素
循环中应该这么写
for (int i = 1; i < N; i++ )for (int j = 1; j < M; j++ )sum{2, 2}{4, 4} = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + arr[i][j];
(3) 求前缀和的特殊处理
求前缀和大部分地方是可以套用上面的公式的,但是最上面那一行以及最左侧那一行前缀和计算是不可以套用公式的。
因为 0 - 1
为 -1
,显然这个位置是错的, sum[0][-1], sum[-1][0], sum[-1][-1]
显然都是错误的。
所以最上面以及最左侧前缀和计算要特殊处理,直接单独写两行代码去计算就行了。
for (int i = 1; i < N; i ++ ) sum[i][0] = sum[i - 1][0] arr[i][0];
for (int i = 1; i < M; i ++ ) sum[0][i] = sum[0][i - 1] arr[0][i];
(4) 通过二维前缀和数组,求子矩阵和
已经知道了 二维前缀和数组,就可以通过二维前缀和数组求出某个矩阵的和了
也是有一个公式可以求得这个和,这个公式其实是前面求前缀和的公式反过来的
原理:
子矩阵和 = (0, 0) 到 (4, 4) 的和 - 上方区域和 - 左方区域和 + 左上重复减去的区域和
公式如下 <– 假如用 sum{x1, y1}{x2, y2}
表示 (x1, y1) 到 (x2, y2)
的和
sum{x1, y1}{x2, y2} = sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1];
比如求 左上角为(2, 2)
, 右下角为 (4, 4)
的矩阵的和
sum{2, 2}{4, 4} = sum[4][4] - sum[1][4] - sum[4][1] + sum[1][1];
对式子进行拆分理解:
sum[x2][y2] - (0, 0) 到 (x2, y2) 的和
sum[x1 - 1][y2] - (0, 0) 到 (x1 - 1, y2) 的和,需要减去的上部分的和
sum[x2][y1 - 1] - (0, 0) 到 (x2, y1 - 1) 的和,需要减去的左部分的和
sum[x1 - 1][y1 - 1] - (0, 0) 到 (x1, y1) 的和,加上减去的重合部分的和
(5) 求矩阵和的特判
如果所求的矩阵和的左上角的位置是位于,
(0, 0) (i, 0) (0, j)
这三种位置,那么求矩阵和的时候要进行特判,因为如果套用上方的公式,那么0 - 1
为-1
,这个位置越界了,而且计算无意义
若矩阵左上角坐标为 (0, 0)
此时就不需要减去某个矩形块了,答案直接 sum[x2][y2]
即可
if (x1 == 0 && y1 == 0) return sum[x2][y2];
//Or
if (!x1 && !y1) return sum[x2][y2];
若矩阵左上角坐标为 (x1, 0)
此时所求矩阵是靠着原矩阵最左侧这一列的,再往左则无任何数值,所以应该减去上半部分的矩形块
if (y1 == 0) return sum[x2][y2] - sum[x1 - 1][y2];
if (!y1) return sum[x2][y2] - sum[x1 - 1][y2];
若矩阵左上角坐标为 (0, y1)
此时所求矩阵是靠着原矩阵最上侧这一行的,再往上则无任何数值,所以应该减去左半部分的矩形块
if (x1 == 0) return sum[x2][y2] - sum[x2][y1 - 1];
if (!x1) return sum[x2][y2] - sum[x2][y1 - 1];
(6) 例题
题目
有一个 3*4 的矩阵 arr[N][M]
{1, 5, 6, 89, 6, 7, 35, 3, 2, 4}
求 (1, 1)
到 (2, 2)
的和
求 (0, 1)
到 (1, 3)
的和
代码如下:
// Author: 郑龙浩/仟濹
// time: 2025-03-08// 题目
// 有一个 3*4 的矩阵 `arr[N][M]`
// ```cpp
// {1, 5, 6, 8
// 9, 6, 7, 3
// 5, 3, 2, 4}
// ```
// 求 `(1, 1)` 到 `(2, 2)` 的和
// 求 `(0, 1)` 到 `(1, 3)` 的和#include <iostream>
#include <algorithm>
using namespace std;
#define N 3
#define M 4
int arr[N][M] = {1, 5, 6, 8,9, 6, 7, 3,5, 3, 2, 4};
int sum[N][M] = {0};
// 计算某矩阵的和
int get_sum(int x1, int y1, int x2, int y2){// 特判// 左上角为 (0, 0)if (!x1 && !y1) return sum[x2][y2];// 左上角为 (x1, 0)if (!y1) return sum[x2][y2] - sum[x1 - 1][y2];// 左上角为 (0, y1)if (!x1) return sum[x2][y2] - sum[x2][y1 - 1];return sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1];
}
int main( void ){// 记得初始化sum[0][0] = arr[0][0];// 计算第一行的前缀和for (int i = 1; i < M; i++) sum[0][i] = sum[0][i - 1] + arr[0][i];// 计算第一列的前缀和for (int i = 1; i < N; i++) sum[i][0] = sum[i - 1][0] + arr[i][0];// 计算全部前缀和for (int i = 1; i < N; i++)for (int j = 1; j < M; j++)sum[i][j] = sum[i - 1][j] + sum[i][j - 1] + arr[i][j] - sum[i - 1][j - 1];// 计算并打印某矩阵的和cout << get_sum(1, 1, 2, 2) << " " << get_sum(0, 1, 1, 3) << endl;return 0;
}
相关文章:
【算法 C/C++】二维前缀和
2025 - 03 - 08 - 第 70 篇 Author: 郑龙浩 / 仟濹 【二维前缀和】 文章目录 前缀和与差分 - 我的博客前缀和(二维)1 基本介绍(1) **sum[i][j] 表示什么???**(2) **前缀和怎么求???计算 sum[i][j]…...
如何使用postman来测试接口
一、postman的介绍与下载 可参考: https://blog.csdn.net/freeking101/article/details/80774271 二、api获取网站 阿里云API应用市场 地址:云市场_镜像市场_软件商店_建站软件_服务器软件_API接口_应用市场 - 阿里云 三、具体测试过程 可模拟浏览…...
olmOCR:高效精准的 PDF 文本提取工具
在日常的工作和学习中,是否经常被 PDF 文本提取问题困扰?例如: 想从学术论文 PDF 中提取关键信息,却发现传统 OCR 工具识别不准确或文本格式混乱?需要快速提取商务合同 PDF 中的条款内容,却因工具不给力而…...
Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)
1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…...
请谈谈 HTTP 中的重定向,如何处理 301 和 302 重定向?
HTTP重定向深度解析:301与302的正确使用姿势 一、重定向本质解析 重定向就像快递员送快递时发现地址变更,新地址会写在包裹单的"改派地址"栏。 浏览器收到3xx状态码时,会自动前往Location头指定的新地址。 常用状态码对比&…...
隧道定向号角喇叭为隧道安全保驾护航
隧道广播系统的搭建:科技赋能,打造安全高效的隧道环境。隧道作为现代交通网络的重要组成部分,其安全管理和信息传递的效率直接关系到整个交通系统的运行。然而,隧道环境的特殊性——封闭、狭窄、回声干扰多,使得传统的…...
RuleOS:区块链开发的“破局者”,开启Web3新纪元
RuleOS:区块链开发的“破冰船”,驶向Web3的星辰大海 在区块链技术的浩瀚宇宙中,一群勇敢的探索者正驾驶着一艘名为RuleOS的“破冰船”,冲破传统开发的冰层,驶向Web3的星辰大海。这艘船,正以一种前所未有的姿…...
C#程序结构及基本组成说明
C# 程序的结构主要由以下几个部分组成,以下是对其结构的详细说明和示例: 1. 基本组成部分 命名空间 (Namespace) 用于组织代码,避免命名冲突。通过 using 引入其他命名空间。 using System; // 引入 System 命名空间类 (Class) C# 是面向对象的语言,所有代码必须定义在类或…...
Django与数据库
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 mysql配置 Django模型体现了面向对象的编程技术,是一种面向对象的编程语言和不兼容类型能相互转化的编程技术,这种技术也叫ORM&#…...
力扣热题 100:二叉树专题进阶题解析(后7道)
系列文章目录 力扣热题 100:哈希专题三道题详细解析(JAVA) 力扣热题 100:双指针专题四道题详细解析(JAVA) 力扣热题 100:滑动窗口专题两道题详细解析(JAVA) 力扣热题 100:子串专题三道题详细解析(JAVA) 力…...
Linux——system V共享内存
共享内存区是最快的IPC(进程内通信)形式,不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源,然后再进行通信,所以想要通过共享内存进行通信,那么第一步一定是让两个…...
【C语言】指针篇
目录 C 语言指针概述指针的声明和初始化声明指针初始化指针 指针的操作解引用操作指针算术运算 指针的用途动态内存分配作为函数参数 指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针 函数指针函数指针的定义和…...
XGBoost介绍
XGBoost:是eXtreme Gradient Boosting(极端梯度提升)的缩写,是一种强大的集成学习(ensemble learning)算法,旨在提高效率、速度和高性能。XGBoost是梯度提升(Gradient Boosting)的优化实现。集成学习将多个弱模型组合起来,形成一个…...
力扣:找到一个数字的 K 美丽值(C++)
一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。0 不能整除任何值。 一个 子字符串 是一个字符串里…...
数据结构:有序表的合并
前文介绍了《有序表的插入》,本文介绍有序表的合并。这两种对有序表的操作,是数据结构中常考的内容,特别是在 408 考卷中,在算法设计的题目中,有可能会考查对有序表的操作。那么,这两篇文章中的方法就是能够…...
AI写论文提示词指令大全,快速写论文
目录 一、十大学术写作提示词1、研究主题2、研究问题3、论文架构4、学术论证5、文献关键要素6、专业文本可读性转换7、学术语言规范化8、提高语言准确性9、多维度、深层论证10、优化文本结构 二、快速写论文提示词1、确认研究选题2、整理相关资料3、快速完成论文大纲4、整合文献…...
物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...
【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统
【从零开始学习计算机科学】计算机组成原理(七)存储器与存储器系统 存储器存储器相关概念存储器分类存储器系统存储器性能指标存储器层次概述程序访问的局部性原理SRAM存储器存储器的读写周期DRAM存储器DRAM控制器高性能的主存储器存储器扩展只读存储器ROM光擦可编程只读存储…...
ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法
Message in a Bottle from bottle import Bottle, request, template, runapp Bottle()# 存储留言的列表 messages [] def handle_message(message):message_items "".join([f"""<div class"message-card"><div class"me…...
Java集合_八股场景题
Java集合 在Java开发中,集合框架是面试和实际开发中非常重要的内容。以下是一些常见的Java集合八股文问题和场景题,以及详细答案和示例代码。 1. Java集合框架的结构是什么? 答案: Java集合框架主要分为三大接口:Col…...
Scaled_dot_product_attention(SDPA)使用详解
在学习huggingFace的Transformer库时,我们不可避免会遇到scaled_dot_product_attention(SDPA)这个函数,它被用来加速大模型的Attention计算,本文就详细介绍一下它的使用方法,核心内容主要参考了torch.nn.functional中该函数的注释…...
SpringBoot(一)--搭建架构5种方法
目录 一、⭐Idea从spring官网下载打开 2021版本idea 1.打开创建项目 2.修改pom.xml文件里的版本号 2017版本idea 二、从spring官网下载再用idea打开 三、Idea从阿里云的官网下载打开 编辑 四、Maven项目改造成springboot项目 五、从阿里云官网下载再用idea打开 Spri…...
初识大模型——大语言模型 LLMBook 学习(一)
1. 大模型发展历程 🔹 1. 早期阶段(1950s - 1990s):基于规则和统计的方法 代表技术: 1950s-1960s:规则驱动的语言处理 早期的 NLP 主要依赖 基于规则的系统,如 Noam Chomsky 提出的 生成语法&…...
Array and string offset access syntax with curly braces is deprecated
警告信息 “Array and string offset access syntax with curly braces is deprecated” 是 PHP 中的一个弃用警告(Deprecation Notice),表明在 PHP 中使用花括号 {} 来访问数组或字符串的偏移量已经被标记为过时。 背景 在 PHP 的早期版本…...
27. Harmonyos Next仿uv-ui 组件NumberBox 步进器组件禁用状态
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 组件介绍2. 效果展示3. 禁用状态设置3.1 整体禁用3.2 输入框禁用3.3 长按禁用 4. 完整示例代码5. 知识点讲解5.1 禁用状态属性5.2 禁用…...
Java高频面试之集合-08
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说CopyOnWriteArrayList CopyOnWriteArrayList 详解 CopyOnWriteArrayList 是 Java 并发包(java.util…...
做到哪一步才算精通SQL
做到哪一步才算精通SQL-Structured Query Language 数据定义语言 DDL for StructCREATE:用来创建数据库、表、索引等对象ALTER:用来修改已存在的数据库对象DROP:用来删除整个数据库或者数据库中的表TRUNCATE:用来删除表中所有的行…...
SpringAI介绍及本地模型使用方法
博客原文地址 前言 Spring在Java语言中一直稳居高位,与AI的洪流碰撞后也产生了一些有趣的”化学反应“,当然你要非要说碰撞属于物理反应也可以, 在经历了一系列复杂的反应方程后,Spring家族的新成员——SpringAI,就…...
空指针异常的触发
面向对象分析: 当你要吃饭,饭是对象,提供吃饭这个功能,所以饭为null时,你去调吃饭这个功能,就是去操作饭这个抽象模型,但这个模型是null,就是空指针异常了,但如果有了饭…...
尚硅谷爬虫note15n
1. 多条管道 多条管道开启(2步): (1)定义管道类 (2)在settings中开启管道 在pipelines中: import urllib.request # 多条管道开启 #(1)定义管道类 #(2)在setti…...
基于SSM+Vue的汽车维修保养预约系统+LW示例
1.项目介绍 系统角色:管理员、员工、用户功能模块:用户管理、员工管理、汽车类型管理、项目类型管理、维修/预约订单管理、系统管理、公告管理等技术选型:SSM,vue(后端管理web),Layuiÿ…...
【商城实战(13)】购物车价格与数量的奥秘
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
在线json转ArkTs-Harmonyos
轻松将 JSON 数据转换为类型安全的 ArkTs 接口。快速准确地生成代码,提升开发效率,告别手动编写,让您的开发流程更加流畅! gotool...
Cannot resolve symbol ‘view‘ Androidstudio报错解决办法
报错原因 出现 Cannot resolve symbol view 错误是因为代码中的 view 变量未正确定义或不在当前作用域内。以下是常见场景和解决方法: 场景 1:在 点击事件监听器 中获取 view 如果代码在 OnClickListener 的 onClick 方法中,view 是方法的参…...
三级缓存架构
三级缓存架构是一种通过分层缓存设计来优化系统性能、降低数据库负载、提高数据访问效率的解决方案,尤其适用于高并发、高吞吐量的业务场景(如电商、社交平台、实时推荐等)。其核心思想是通过多级缓存逐层过滤请求,减少对底层存储…...
webshell一些上传心得
我们以upload-labs为基础 一、前端拦截: 如第一关 工作方式: 直接在前端拦截 绕过方式: 因为没有限制后端,所有可以用bs 绕过前端修改格式即可 将需要上传的php文件改成jpg格式 使用burp suite 拦截上传后,使用re…...
doris:阿里云 MaxCompute
MaxCompute 是阿里云上的企业级 SaaS(Software as a Service)模式云数据仓库。 什么是 MaxCompute 连接 MaxCompute 示例 -- 1. 创建Catalog。 CREATE CATALOG mc PROPERTIES ("type" "max_compute","mc.default.projec…...
MyBatis-Plus 分页查询接口返回值问题剖析
在使用 MyBatis-Plus 进行分页查询时,很多开发者会遇到一个常见的问题:当分页查询接口返回值定义为 Page<T> 时,执行查询会抛出异常;而将返回值修改为 IPage<T> 时,分页查询却能正常工作。本文将从 MyBatis-Plus 的分页机制入手,详细分析这一问题的根源,并提…...
【面试】框架
框架 1、介绍一下Spring 的 IOC2、将一个类声明为 Bean 的注解有哪些3、Bean 的作用域有哪些4、Spring 框架中的 Bean 是线程安全的吗5、Spring 容器对象的懒加载6、Spring 容器中的 bean 生命周期7、谈谈自己对于 Spring DI 的了解8、注入 Bean 的注解有哪些9、Spring Boot 如…...
MWC 2025 | 紫光展锐联合移远通信推出全面支持R16特性的5G模组RG620UA-EU
2025年世界移动通信大会(MWC 2025)期间,紫光展锐联合移远通信,正式发布了全面支持5G R16特性的模组RG620UA-EU,以强大的灵活性和便捷性赋能产业。 展锐芯加持,关键性能优异 RG620UA-EU模组基于紫光展锐V62…...
《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)
目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功: 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具:Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…...
Mysql内置函数
日期函数: 例如: select current_date();---打印日期 select current_time()----打印时间 select current_timestamp();打印时间戳 select now(); ----日期时间 select date(‘2020-10-01 00:00:00’); ----提取日期进行打印: 也可以配合…...
一文了解汽车图像传感器
2024年底,安森美做了题为"How Automotive Image Sensors Transform the Future of Autonomous Driving"的演讲,这里结合其内容对自动驾驶图像传感器做一个介绍。 当前的自动驾驶感知技术主要有两大技术路线:一种是仅使用摄像头作为传感器进行信息采集的纯…...
cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能
cocos creator版本2.4.11 一个mask占用drawcall 3个以上,针对游戏中技能图标,cd,以及多玩家头像,是有很大优化空间 1.上代码,只适合单独图片的,不适合在图集中的图片 const { ccclass, property } cc._decorator;c…...
面向高质量视频生成的扩散模型方法-算法、架构与实现【附核心代码】
目录 算法原理 架构 代码示例 算法原理 正向扩散过程:从真实的视频数据开始,逐步向其中添加噪声,随着时间步 t 的增加,噪声添加得越来越多,最终将原始视频数据变成纯噪声。数学上,t 时刻的视频数据与 t…...
vue3框架的响应式依赖追踪机制
当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示,但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图,这是为什么?我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新,单当视图中不存在…...
Ubuntu本地部署Open manus(完全免费可用)
目录 1.介绍 2.环境搭建 3.更改配置 4.运行 1.介绍 关于由于邀请码的限制,导致很多用户无法顺利体验manus带来的ai agent体验,但是最近开源的open manus是另一个不错的选择。 先来看看运行的结果: 我让open manus帮我打开小米的主页&am…...
MacOS Big Sur 11 新机安装brew wget python3.12 exo
MacOS Big Sur 11,算是很老的系统了,所以装起来brew有点费劲。 首先安装brew 官网: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 官网加速: 按照官网的方法࿰…...
基于USB Key的Web系统双因素认证解决方案:构建安全与便捷的登录体系
摘要 在网络安全威胁日益严峻的背景下,传统的“用户名密码”认证方式已难以应对钓鱼攻击、密码窃取等风险。上海安当基于USB Key技术,推出了一套面向Web系统的双因素认证解决方案,通过硬件与密码学的深度融合,实现用户身份的高强度…...
项目工坊 | Python驱动淘宝信息爬虫
目录 前言 1 完整代码 2 代码解读 2.1 导入模块 2.2 定义 TaoBao 类 2.3 search_infor_price_from_web 方法 2.3.1 获取下载路径 2.3.2 设置浏览器选项 2.3.3 反爬虫处理 2.3.4 启动浏览器 2.3.5 修改浏览器属性 2.3.6 设置下载行为 2.3.7 打开淘宝登录页面 2.3.…...