当前位置: 首页 > news >正文

【算法笔记】前缀和算法原理深度剖析(超全详细版)

【算法笔记】前缀和算法原理深度剖析(超全详细版)

🔥个人主页大白的编程日记

🔥专栏算法笔记


文章目录

  • 【算法笔记】前缀和算法原理深度剖析(超全详细版)
    • 前言
    • 一.一维前缀和
      • 1.1题目
      • 1.2算法原理解析
      • 1.3代码实现
    • 二.二维前缀和
      • 2.1题目
      • 2.2算法原理解析
      • 2.3下标映射
      • 2.4初始化问题
      • 2.5代码实现
    • 三.寻找数组的中心下标
      • 3.1题目
      • 3.2思路分析
      • 3.3代码实现
    • 四.除自身以外数组的乘积
      • 4.1题目
      • 4.2思路分析
      • 4.3总结
      • 4.4代码实现
    • 五.和为k的子数组
      • 5.1题目
      • 5.2思路分析
      • 5.3代码实现
    • 六.和可被k整除的子数组
      • 6.1题目
      • 6.4思路分析
      • 6.3代码实现
    • 七.连续数组
      • 7.1题目
      • 7.1思路分析
      • 7.3代码实现
    • 八.矩阵区域和
      • 8.1题目
      • 8.2思路分析
      • 8.3代码实现
    • 后言

前言

哈喽,各位小伙伴大家好!上期我们讲了二分算法。今天我们来讲前缀和的算法原理。话不多说,咱们进入正题!向大厂冲锋!

一.一维前缀和

1.1题目

  • 题目:【模板】前缀和

1.2算法原理解析

我们根据前缀和算法就可以快速求出区间和。

为了防止越界,我们要让前缀和数组下标从1开始。

1.3代码实现

#include <iostream>
#include<vector>
using namespace std;
int main() 
{int n,q;cin>>n>>q;vector<long long> dp(n+1);//多开一个节点防止越界int tmp=0;for(int i=1;i<=n;i++){cin>>dp[i];}for(int i=1;i<=n;i++){dp[i]+=dp[i-1];}int l,r;while(q--){cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;}
}
// 64 位输出请用 printf("%lld")

二.二维前缀和

2.1题目

  • 题目:二维前缀和

2.2算法原理解析

2.3下标映射

2.4初始化问题

如果用到两个前缀和区间求某区间的和
我们初始化的值并不重要。
在这里插入图片描述

  • 验证

2.5代码实现

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

三.寻找数组的中心下标

3.1题目

  • 题目:寻找数组的中心下标

3.2思路分析

这里我们借助前缀和数组和后缀和数组即可快速判断中心下标。

3.3代码实现

class Solution {
public:int pivotIndex(vector<int>& nums){int n=nums.size();vector<int> f(n),g(n);for(int i=1;i<n;i++)//前缀和数组{f[i]=nums[i-1]+f[i-1];}for(int i=n-2;i>=0;i--)//后缀和数组{g[i]=g[i+1]+nums[i+1];}for(int i=0;i<n;i++)//判断{if(f[i]==g[i]){return i;}}return -1;}
};

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

4.1题目

  • 题目:除自身以外数组的乘积

4.2思路分析

4.3总结

4.4代码实现

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n=nums.size();vector<int> f(n),g(n),ret(n);f[0]=g[n-1]=1;for(int i=1;i<n;i++)//前缀和数组{f[i]=f[i-1]*nums[i-1];}for(int i=n-2;i>=0;i--)//后缀和数组{g[i]=g[i+1]*nums[i+1];}for(int i=0;i<n;i++){ret[i]=f[i]*g[i];}return ret;}
};

五.和为k的子数组

5.1题目

  • 题目:和为k的子数组

5.2思路分析

5.3代码实现

class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> hash;hash[0]=1;//整个区间和为kint sum=0,ret=0;for(auto e:nums){sum+=e;//计算前缀和if(hash.count(sum-k))//统计和为sum-k区间个数{ret+=hash[sum-k];}hash[sum]++;//填入前缀和信息}return ret;}
};

六.和可被k整除的子数组

6.1题目

  • 题目:和可被k整除的子数组

6.4思路分析

6.3代码实现

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int,int> hash;hash[0]=1;//整个区间和为kint sum=0,ret=0;for(auto e:nums){sum+=e;//计算前缀和if(hash.count((sum%k+k)%k))//统计和为被k整除区间个数负数修正{ret+=hash[(sum%k+k)%k];}hash[(sum%k+k)%k]++;//填入前缀和%k信息}//(a-b)%p==a%p==b%p同余定理return ret;}
};

七.连续数组

7.1题目

  • 题目:连续数组

7.1思路分析

7.3代码实现

class Solution {
public:int findMaxLength(vector<int>& nums){unordered_map<int,int> hash;hash[0]=-1;int sum=0,len=0;for(int i=0;i<nums.size();i++){sum+=(nums[i]==0?-1:1);//0就变成-1;if(hash.count(sum-0)){len=max(len,i-hash[sum]);//更新长度}else//相同的前缀和不更新{hash[sum]=i;//更新哈希表前缀和信息}}return len;}
};

八.矩阵区域和

8.1题目

  • 题目:矩阵区域和

8.2思路分析

8.3代码实现

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k){int m=mat.size(),n=mat[0].size();vector<vector<int>> arr(m+1,vector<int>(n+1));for(int i=1;i<m+1;i++)//处理前缀和数组{for(int j=1;j<n+1;j++){arr[i][j]=arr[i][j-1]+arr[i-1][j]-arr[i-1][j-1]+mat[i-1][j-1];}}vector<vector<int>> arr1(m,vector<int>(n));for(int i=0;i<m;i++){for(int j=0;j<n;j++){int x1=max(0,i-k)+1;int x2=min(m-1,i+k)+1;int y1=max(0,j-k)+1;int y2=min(n-1,j+k)+1;//计算下标 +1映射dp数组arr1[i][j]=arr[x2][y2]-arr[x2][y1-1]-arr[x1-1][y2]+arr[x1-1][y1-1];}}return arr1;}
};

后言

这就是前缀和算法原理的深度剖析。大家自己好好消化理解。今天 就分享到这,感谢各位大耐心垂阅!咱们下期见!拜拜~

相关文章:

【算法笔记】前缀和算法原理深度剖析(超全详细版)

【算法笔记】前缀和算法原理深度剖析&#xff08;超全详细版&#xff09; &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】前缀和算法原理深度剖析&#xff08;超全详细版&#xff09;前言一.一维前缀和1.1题…...

linux之网络子系统- 地址解析协议arp 源码分析和邻居通用框架

一、arp 的作用 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是将IP地址解析为以太网MAC地址&#xff08;物理地址&#xff09;的协议。在局域网中&#xff0c;当主机或其他网络设备有数据要发送给另一个主机或设备时&#xff0c;它必须知…...

经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】

题目理解 我们要在给定的股票价格数组 prices 中进行买卖操作&#xff0c;并尽可能多次交易以获取最大利润。每次交易都需要支付一定的手续费 fee&#xff0c;因此我们必须考虑如何通过合适的交易策略最大化利润。 在本题中&#xff0c;每一天可以选择&#xff1a; 不进行任…...

Python画笔案例-088 绘制 滚动的汉字

1、绘制 滚动的汉字 通过 python 的turtle 库绘制 滚动的汉字,如下图: 2、实现代码 绘制 滚动的汉字,以下为实现代码: """滚动的汉字.py """ import time from turtle import * from write_patch import *width,height...

Redis 5.0 安装配置(Windows)

Redis 5.0之后支持Redis Stream等功能 下载地址&#xff1a;Releases tporadowski/redis GitHub 点击运行redis-server.exe 此外&#xff1a;Redis 6.0及以后版本目前都没有Windows版...

金融行业:办公安全防护专属攻略

在中国金融市场快速迈向数字化转型的进程中&#xff0c;数据安全与隐私保护成为了不容忽视的关键议题。面对不断升级的网络威胁和日益严格的监管要求&#xff0c;构建一个既能支持创新又能提供坚实防护的信息安全体系变得尤为重要。亿格云不断深耕办公安全领域&#xff0c;为金…...

python如何基于numpy pandas完成复杂的数据分析操作?

数据分析是现代数据科学的重要组成部分,Python作为一种强大的编程语言,提供了许多库来简化数据分析过程。 其中,NumPy和Pandas是两个最常用的库。NumPy主要用于数值计算,而Pandas则提供了强大的数据结构和数据分析工具。 本文将深入探讨如何利用这两个库进行复杂的数据分…...

Linux中定时任务调度工具——crontab

1.简介 crontab是Unix和类Unix操作系统&#xff08;如Linux&#xff09;中用于定时任务调度的工具。其名称来源于“cron”这个守护进程&#xff0c;它负责周期性地执行任务&#xff0c;并且“tab”表示这个工具的配置文件。用户可以通过配置crontab文件来设定定时任务&#xf…...

思维+差分,CF 1884C - Medium Design

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1884C - Medium Design 二、解题报告 1、思路分析 考虑 最大值 和 最小值…...

简单介绍冯诺依曼体系

现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算和逻辑判断。存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制方式存储&#xff09;。输入设备&#xff1a;用户给计算机发号施令。输出设备&#xff1a;计算机…...

kernel32.dll下载地址:如何安全地恢复系统文件

关于从网络上寻找kernel32.dll的下载地址&#xff0c;这通常不是一个安全的做法&#xff0c;而且可能涉及到多种风险。kernel32.dll是Windows操作系统的核心组件之一&#xff0c;负责内存管理、进程和线程管理以及其他关键系统功能。因为kernel32.dll是系统的基础文件&#xff…...

【高等数学】多元微分学 (一)

偏导数 偏导数定义 如果二元函数 f f f 在 x 0 , y 0 x_0,y_0 x0​,y0​ 的某邻域有定义, 且下述极限存在 lim ⁡ Δ x → 0 f ( x 0 Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x \lim_{\Delta x\to 0} \frac{f(x_0\Delta x,y_0)-f(x_0,y_0)}{\Delta x} Δx→0lim​Δxf(x0​Δ…...

Python爬取京东商品信息,详细讲解,手把手教学(附源码)

Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.c…...

大家有没有了解过TLKS-PLGS这款接地电阻在线监测装置?它在电力系统中能发挥什么作用呢?

接地电阻在线监测仪&#xff08;输电铁塔接地电阻监测装置、变电站接地电阻监测装置、三极法接地网电阻监测装置&#xff09;在电力系统中发挥着至关重要的作用&#xff0c;具体来说&#xff0c;有以下几个方面&#xff1a; 一、实时监测预警。该装置采用激励脉冲技术&#xf…...

Shell中的函数

目录 一、系统函数 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;常用的函数 basename [string/pathname] [suffix] 二、自定义函数 &#xff08;一&#xff09;语法 &#xff08;二&#xff09;脚本例子 三、函数实际案例 过程中的报错&#xff1a; …...

通过IP地址或者主机名添加打印机20241023

文印室打印机连接方式20241023 Win键盘搜索打印机和扫描仪点击添加打印机或扫描仪&#xff0c;等候片刻点击“我需要的打印机不在列表中”添加打印机&#xff0c;选择使用IP地址或主机名添加打印机点击下一步&#xff0c;设备类型选择自动检测输入主机名&#xff1a;即打印机有…...

基于SpringBoot+Vue智慧养老关爱系统【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; 这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、努力、精进。通过2024年…...

新手教学系列——利用短效代理快速搭建代理池

引言 在进行高并发数据抓取时,很多人都会遇到频繁IP被封的问题。要解决这个问题,代理池的搭建就成了关键。通过频繁更换代理IP,我们可以绕过网站的反爬机制,提升抓取效率。然而,很多初学者可能会觉得构建一个健壮的代理池颇为复杂,尤其是需要快速切换的短效代理池。在这…...

实体与DTO如何转换

下面是一些常用的转换库&#xff1a; Dozer 该项目目前不活跃&#xff0c;并且很可能在未来被弃用。 ModelMapper 一个智能对象映射库&#xff0c;可自动将对象相互映射。它采用基于约定的方法&#xff0c;同时提供简单、重构安全的应用程序接口&#xff08;API&#xff09;来…...

Docker 安装Postgres和PostGIS,并制作镜像

1. 查找postgres和postgis现有的镜像和版本号 镜像搜索网站&#xff1a;https://docker.aityp.com/ 测试使用的是postgres:15.4 和 postgis:15-3.4 2、镜像拉取 docker pull postgres:15.4docker pull postgis/postgis:15-3.4镜像下载完成&#xff0c;docker images 查看如…...

ComfyUI全面掌握-知识点详解——自定义节点安装与首次 AI 绘图(实操+排错)

本文为系列第 6 篇&#xff08;第一章第 5 个知识点&#xff09;&#xff0c;讲解自定义节点的作用与安装方式&#xff0c;手把手教读者加载默认工作流、完成首次 AI 绘图&#xff0c;解读核心参数并排查常见问题。 目录 一、引言&#xff1a;自定义节点是什么&#xff1f;为什…...

做定制开发的定制软件开发公司平台

在数字化转型浪潮下&#xff0c;“定制软件开发”几乎成了每一家力图通过技术构建壁垒的企业的必选项。然而&#xff0c;一个令人尴尬的现实是&#xff1a;很多企业在数字化上砸了重金&#xff0c;不仅没换来效率&#xff0c;反而陷入了“开发超预算、交付总延期、上线全是坑”…...

工程师实战:Windows 8工作站部署、驱动危机与专业工具兼容性全解析

1. 从工程师视角看Windows 8的喧嚣与真实2013年&#xff0c;当Windows 8带着那个被称为“Metro”的崭新界面横空出世时&#xff0c;整个科技圈&#xff0c;尤其是我们这些整天和硬件、设计工具打交道的工程师群体&#xff0c;几乎炸开了锅。媒体上充斥着两极分化的评价&#xf…...

量子计算采购策略与技术路线比较

1. 量子计算采购的现状与挑战 量子计算技术正在经历从实验室研究向实际应用过渡的关键阶段。根据2023年全球量子计算产业报告&#xff0c;量子处理器市场规模预计将从2023年的4.7亿美元增长到2030年的65亿美元&#xff0c;年复合增长率高达45%。然而&#xff0c;面对超导、离子…...

手把手教你ClickHouse(二、Windows下Docker部署与可视化实战)

1. Windows下Docker环境准备 在开始部署ClickHouse之前&#xff0c;我们需要先确保Windows系统已经正确配置Docker环境。这里我推荐使用Docker Desktop for Windows&#xff0c;它提供了图形化界面和完整的容器管理功能。安装过程可能会遇到几个常见坑点&#xff0c;我把自己实…...

taotoken模型广场功能体验与主流模型选型建议

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken模型广场功能体验与主流模型选型建议 1. 平台入口与模型广场概览 登录Taotoken控制台后&#xff0c;最直观的功能入口之一…...

STM32L4低功耗实战:用RTC内部唤醒定时1秒,让设备续航翻倍(附CubeIDE配置)

STM32L4低功耗实战&#xff1a;RTC唤醒中断与CubeIDE配置全解析 在电池供电的物联网终端设计中&#xff0c;每微安电流都关乎产品寿命。曾有个智能农业项目&#xff0c;原本预计6个月的传感器续航&#xff0c;因未优化低功耗模式&#xff0c;实际仅维持了3周。这促使我们深入研…...

CMS三十年:从“手工建站”到“智能基座”

一个从业者的观察与思考不知不觉&#xff0c;跟CMS打交道已经十几年了。从早期的织梦、帝国&#xff0c;到后来的WordPress&#xff0c;再到现在的各类无头CMS和低代码平台&#xff0c;这个领域的变化比想象中要快得多。写这篇文章&#xff0c;算是对CMS发展历程的一次梳理&…...

谷歌seo付费外链是什么? 深度拆解5种主流的外链买卖方式

在目前的搜索环境下&#xff0c;想要让网站在没有外部引荐的情况下出现在搜索结果前排&#xff0c;难度不亚于在一座无人的深山里开店却希望客流量爆满。链接建设&#xff0c;或者说大家心照不宣的“外链买卖”&#xff0c;已经变成了提升排名的必经之路。一、 揭开付费外链的真…...

数据分析实习面试准备全攻略:专业知识+项目深挖+行为面试,职卓科技的面试辅导体系

摘要数据分析实习面试通常包含三大模块&#xff1a;专业知识考察&#xff08;SQL、Python、统计学基础&#xff09;、项目深挖&#xff08;业务理解、技术选择、问题解决&#xff09;、行为面试&#xff08;团队协作、学习能力、职业规划&#xff09;。很多学员在面试中表现不佳…...