【算法篇】前缀和

Alt

🔥个人主页Quitecoder

🔥专栏算法笔记仓

Alt

前缀和是一种常用于处理数组区间求和问题的技巧。它可以用来减少重复计算,使得多次查询区间和的时间复杂度从 O(n) 降低到 O(1)

目录

  • 1. 一维模版
  • 2. 二维模版
  • 3. 除自身以外数组的乘积
  • 4. 和为K的子数组个数
  • 5. 和可被 K 整除的子数组
  • 6. 连续数组

1. 一维模版

题目链接:牛客1
题目描述在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;int main() {int n,q;cin>>n>>q;vector<int> v1(n+1);vector<long long int> dp(n+1);  for(int i=1;i<=n;i++){cin>>v1[i];dp[i]=dp[i-1]+v1[i];}int l,r;while(q--){cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;}return 0;
}

2. 二维模版

题目链接:牛客2
题目描述
在这里插入图片描述

在这里插入图片描述

#include <iostream>
#include<vector>
using namespace std;
int main()
{int n,m,q;cin>>n>>m>>q;vector<vector<int>> v1(n+1,vector<int>(m+1));vector<vector<long long int>> dp(n+1,vector<long long int>(m+1));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>v1[i][j];dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+v1[i][j];}}int x1,y1,x2,y2;while(q--){cin>>x1>>y1>>x2>>y2;cout<<dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]<<endl;    }return 0;
}

3. 除自身以外数组的乘积

题目链接:除自身以外数组的乘积
题目描述在这里插入图片描述
在这里插入图片描述

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n=nums.size();vector<int> dpf(n),dpg(n),result(n);dpf[0]=dpg[n-1]=1;for(int i=1;i<n;i++){dpf[i]=dpf[i-1]*nums[i-1];}for(int i=n-2;i>=0;i--){dpg[i]=dpg[i+1]*nums[i+1];}for(int i=0;i<n;i++){result[i]=dpf[i]*dpg[i];}return result;}
};

4. 和为K的子数组个数

题目链接:和为K的子数组个数
题目描述在这里插入图片描述

在这里插入图片描述

class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> hash;int sum=0,count=0;hash[0]=1;for(int i=0;i<nums.size();i++){sum+=nums[i];//当前位置前缀和if(hash.count(sum-k)){count+=hash[sum-k];}hash[sum]++;}return count;}
};

5. 和可被 K 整除的子数组

题目链接:和可被 K 整除的子数组
题目描述在这里插入图片描述

在这里插入图片描述

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int,int> hash;//存前缀和的余数hash[0]=1;int sum=0,count=0;for(int i=0;i<nums.size();i++){sum+=nums[i];int p1=(sum%k+k)%k;if(hash.count(p1)){count+=hash[p1];}hash[p1]++;}return count;}
};

nums = [4, 5, 0, -2, -3, 1], k = 5

代码逻辑详解
关键变量的作用

  1. sum: 当前的前缀和。
  2. hash: 一个哈希表,记录前缀和的余数出现的次数。
    • hash[0] = 1: 初始设置表示前缀和本身就是 0 m o d k 0 \bmod k 0modk 的情况。
  3. count: 用来记录满足条件的子数组数量。

  1. 初始化:
    • hash = {0: 1}
    • sum = 0
    • count = 0

逐步遍历数组
第 1 步i = 0, nums[i] = 4

  • 累加前缀和:sum = sum + nums[i] = 0 + 4 = 4
  • 计算余数:p1 = (sum % k + k) % k = (4 % 5 + 5) % 5 = 4
  • 检查哈希表中是否存在余数 p1 = 4
    • 不存在,说明没有子数组可以被 5 整除。
  • 更新哈希表:
    • hash[4] = 1
  • 当前状态:
    • hash = {0: 1, 4: 1}
    • count = 0

第 2 步i = 1, nums[i] = 5

  • 累加前缀和:sum = sum + nums[i] = 4 + 5 = 9
  • 计算余数:p1 = (sum % k + k) % k = (9 % 5 + 5) % 5 = 4
  • 检查哈希表中是否存在余数 p1 = 4
    • 存在,出现过 1 次。
    • 增加计数:count = count + hash[4] = 0 + 1 = 1
  • 更新哈希表:
    • hash[4] = 2
  • 当前状态:
    • hash = {0: 1, 4: 2}
    • count = 1

第 3 步i = 2, nums[i] = 0

  • 累加前缀和:sum = sum + nums[i] = 9 + 0 = 9
  • 计算余数:p1 = (sum % k + k) % k = (9 % 5 + 5) % 5 = 4
  • 检查哈希表中是否存在余数 p1 = 4
    • 存在,出现过 2 次。
    • 增加计数:count = count + hash[4] = 1 + 2 = 3
  • 更新哈希表:
    • hash[4] = 3
  • 当前状态:
    • hash = {0: 1, 4: 3}
    • count = 3

第 4 步i = 3, nums[i] = -2

  • 累加前缀和:sum = sum + nums[i] = 9 + (-2) = 7
  • 计算余数:p1 = (sum % k + k) % k = (7 % 5 + 5) % 5 = 2
  • 检查哈希表中是否存在余数 p1 = 2
    • 不存在。
  • 更新哈希表:
    • hash[2] = 1
  • 当前状态:
    • hash = {0: 1, 4: 3, 2: 1}
    • count = 3

第 5 步i = 4, nums[i] = -3

  • 累加前缀和:sum = sum + nums[i] = 7 + (-3) = 4
  • 计算余数:p1 = (sum % k + k) % k = (4 % 5 + 5) % 5 = 4
  • 检查哈希表中是否存在余数 p1 = 4
    • 存在,出现过 3 次。
    • 增加计数:count = count + hash[4] = 3 + 3 = 6
  • 更新哈希表:
    • hash[4] = 4
  • 当前状态:
    • hash = {0: 1, 4: 4, 2: 1}
    • count = 6

第 6 步i = 5, nums[i] = 1

  • 累加前缀和:sum = sum + nums[i] = 4 + 1 = 5
  • 计算余数:p1 = (sum % k + k) % k = (5 % 5 + 5) % 5 = 0
  • 检查哈希表中是否存在余数 p1 = 0
    • 存在,出现过 1 次。
    • 增加计数:count = count + hash[0] = 6 + 1 = 7
  • 更新哈希表:
    • hash[0] = 2
  • 当前状态:
    • hash = {0: 2, 4: 4, 2: 1}
    • count = 7

遍历完成后,count = 7,即共有 7 个子数组的和可以被 5 整除


6. 连续数组

题目链接:连续数组
题目描述在这里插入图片描述

在这里插入图片描述

class Solution {
public:int findMaxLength(vector<int>& nums) {// 将数组中的 0 转换为 -1for (int i = 0; i < nums.size(); i++) {if (nums[i] == 0) nums[i] = -1;}// 使用哈希表记录前缀和首次出现的位置unordered_map<int, int> hash;hash[0] = -1; // 初始化:前缀和为 0 时的位置是 -1int sum = 0;     // 当前前缀和int maxLength = 0; // 最长子数组长度for (int i = 0; i < nums.size(); i++) {sum += nums[i];// 如果前缀和 sum 已经存在于哈希表中,更新最长长度if (hash.count(sum)) {maxLength = max(maxLength, i - hash[sum]);} else {// 如果前缀和 sum 第一次出现,记录其位置hash[sum] = i;}}return maxLength;}
};

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

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

相关文章

第R4周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据集可视化4、数据集预处理5、设置X&#xff0c;y6、划分数据集7、构建模型8、定义训练函…

机组存储系统

局部性 理论 程序执行&#xff0c;会不均匀访问主存&#xff0c;有些被频繁访问&#xff0c;有些很少被访问 时间局部性 被用到指令&#xff0c;不久可能又被用到 产生原因是大量循环操作 空间局部性 某个数据和指令被使用&#xff0c;附近数据也可能使用 主要原因是顺序存…

Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt绘图基础 QPainter概述 基本工作流程 绘图事件系统 paintEvent事件 重绘机制 文字绘制技术 基本文字绘制 ​编辑 高级文字效果 基本图形绘制 线条绘制 ​编辑 形状绘制 …

mapbox进阶,添加绘图控件

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图控…

client-go 的 QPS 和 Burst 限速

1. 什么是 QPS 和 Burst &#xff1f; 在 kubernetes client-go 中&#xff0c;QPS 和 Burst 是用于控制客户端与 Kubernetes API 交互速率的两个关键参数&#xff1a; QPS (Queries Per Second) 定义&#xff1a;表示每秒允许发送的请求数量&#xff0c;即限速器的平滑速率…

WeakAuras NES Script(lua)

WeakAuras NES Script 修星脚本字符串 脚本1&#xff1a;NES !WA:2!TMZFWXX1zDxVAs4siiRKiBN4eV(sTRKZ5Z6opYbhQQSoPtsxr(K8ENSJtS50(J3D7wV3UBF7E6hgmKOXdjKsgAvZFaPTtte0mD60XdCmmecDMKruyykDcplAZiGPfWtSsag6myGuOuq89EVDV9wPvKeGBM7U99EFVVVV33VFFB8Z2TJ8azYMlZj7Ur3QDR(…

【make】makefile 函数全解

目录 makefile简介函数全解介绍相关链接字符串处理函数subst 函数—字符串替换patsubst 函数 — 模式字符串替换strip 函数 — 去空格findstring 函数 — 查找字符串filter 函数 — 过滤器filter-out 函数 — 过滤器sort 函数 — 排序word 函数 — 取单词wordlist函数 — 取一串…

Android 15应用适配指南:所有应用的行为变更

Android系统版本适配&#xff0c;一直是影响App上架Google Play非常重要的因素。 当前Google Play政策规定 新应用和应用更新 必须以 Android 14&#xff08;API 级别 34&#xff09;为目标平台&#xff0c;才能提交到Google Play。现有应用 必须以 Android 13&#xff08;AP…

Java Agent(三)、ASM 操作字节码入门

目录 1、前言 2、什么是ASM&#xff1f; 2.1、工作流程 2.2、ASM集合核心API 2.1.1、ClassReader 2.1.2、ClassWriter 2.1.3、 ClassVisitor 2.1.4、MethodVisitor 2.1.5、 FieldVisitor 2.1.6、Opcodes 3、简单示例 3.1、maven依赖 3.2、hello world 3.3、执行结…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

[微服务]redis数据结构

介绍 我们常用的Redis数据类型有5种&#xff0c;分别是&#xff1a; StringListSetSortedSetHash 还有一些高级数据类型&#xff0c;比如Bitmap、HyperLogLog、GEO等&#xff0c;其底层都是基于上述5种基本数据类型。因此在Redis的源码中&#xff0c;其实只有5种数据类型。 …

PyQt5

PyQt5 环境搭建安装 pycharm安装 PyQt5 打包成exe安装 pyinstaller打包 报错进程已结束&#xff0c;退出代码-1073740791&#xff08;0xC0000409&#xff09; 环境搭建 安装 pycharm 安装 PyQt5 pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simplepip install …

高级运维:shell练习2

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 vim check.sh #!/bin/bash# 定义网络前缀 network_prefix"192.168.1"# 循环遍历1-254的IP for i in {1..254}; do# 构造完整的IP地址ip"$network_…

Grails应用http.server.requests指标数据采集问题排查及解决

问题 遇到的问题&#xff1a;同一个应用&#xff0c;Spring Boot(Java)和Grails(Groovy)混合编程&#xff0c;常规的Spring Controller&#xff0c;可通过Micromete Pushgateway&#xff0c; 采集到http.server.requests指标数据&#xff0c;注意下面的指标名称是点号&#…

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…

【2025 Rust学习 --- 17 文本和格式化 】

字符串与文本 Rust 的主要文本类型 String、str 和 char 内容概括&#xff1a; Unicode 背景知识&#xff1f;单个 Unicode 码点的 char&#xff1f;String 类型和 str 类型都是表示拥有和借用的 Unicode 字符序列。Rust 的字符串格式化工具&#xff0c;比如 println! 宏和 …

EasyCVR视频汇聚平台如何配置webrtc播放地址?

EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持多协议接入&#xff0c;能将接入到视频流转码为多格式进行分发&#xff0c;包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…

rknn环境搭建之docker篇

目录 1. rknn简介2. 环境搭建2.1 下载 RKNN-Toolkit2 仓库2.2 下载 RKNN Model Zoo 仓库2.3 下载交叉编译器2.4 下载Docker镜像2.5 下载ndk2.5 加载docker镜像2.6 docker run 命令创建并运行 RKNN Toolkit2 容器2.7 安装cmake 3. 模型转换3.1 下载模型3.2 模型转换 4. 编译cdem…

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库&#xff0c;如下图&#xff1a; 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境&#xff1a; 1. 安装和配置Prometheus&#xff1a; - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…

W25Q64-FLASH

前言&#xff1a; 1.理解flash的组织结构&#xff0c;block块, sector扇区&#xff0c;page页&#xff0c;之间的结构怎么组织安排划分的。 2.理解flash的特性&#xff0c;只能从1写为0&#xff0c;不能从0写为1&#xff0c;这就是为什么写之前要先擦除操作。(这个特性一直困扰…