【刷题】前缀和入门

在这里插入图片描述

送给大家一句话:
既然已经做出了选择,最好还是先假定自己是对的。焦虑未来和后悔过去,只经历一个就够了。 – 张寒寺 《不正常人类症候群》

☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆
☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆
☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆


前缀和入门

  • 1 前言
    • 1.1 算法步骤
    • 1.2 使用场景
    • 1.3 时间复杂度分析
    • 1.4 空间复杂度分析
  • 2 牛客 DP35 【模板】二维前缀和
    • 题目描述
    • 算法思路
  • 3 牛客 DP35 【模板】二维前缀和
    • 题目描述
    • 算法思路
  • Leetcode 724. 寻找数组的中心下标
    • 题目描述
    • 算法思路
  • Leetcode 238. 除自身以外数组的乘积
    • 题目描述
    • 算法思路
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1 前言

今天我学习了一个新算法:前缀和算法。
前缀和算法是一种高效处理数组区间和查询问题的算法。它的核心思想是在 O(n) 的时间复杂度内对输入数组进行预处理,从而使得后续每次查询数组中任意区间内元素和的时间复杂度降低到 O(1)。

1.1 算法步骤

  1. 初始化前缀和数组:创建一个新数组 dp,一般多开一位。
  2. 计算前缀和:遍历原数组 A,根据题目更新状态。
  3. 查询区间和:更加区间得到答案。

1.2 使用场景

  1. 频繁区间和查询:当需要对一个数组进行多次区间和查询时,前缀和可以大幅提高查询效率。
  2. 动态数据更新:在某些情况下,数组中的元素可能会动态更新,前缀和也能有效处理这种情况下的区间和查询。
  3. 多维数组处理:前缀和可以扩展到多维数组,用于处理多维数据区间和的问题。

1.3 时间复杂度分析

  • 预处理时间复杂度:O(n),其中 n 是原数组 A 的长度。
  • 查询时间复杂度:O(1),对于每次区间和查询。

1.4 空间复杂度分析

  • 空间复杂度:O(n),用于存储前缀和数组 dp。

前缀和算法在处理数组区间和问题时非常高效,适用于需要频繁查询和高效处理大量数据的场景。通过前缀和的预处理,可以显著减少计算成本,提高程序的运行效率,也就是 空间换时间

2 牛客 DP35 【模板】二维前缀和

上链接!!! DP34 一维前缀和

题目描述

在这里插入图片描述
根据题目描述,我们大概知道我们是求一个区间上的和。题目很好理解奥,接下来我们就来通过这道题来入门前缀和算法!!!

算法思路

首先最好想的就是暴力算法,求指定区间的和那么直接暴力求不就可以了?!但是毋庸置疑的是这样一定一定会超时,毕竟是O(n^2)的暴力算法。

那么来看前缀和算法,这是一个解决这个问题的优秀算法。前缀和的思想很简单,就是对数组进行一遍预处理,得到每个数组位置之前所有数的和,然后在通过减法求得数据。

  1. 创建一个大小为 n + 1 的数组(大小为 n + 1可以避免一些边界情况)
  2. 从 下标 1 开始读入数据
  3. 创建一个大小为 n + 1 的 dp 数组
  4. 从 下标 1 开始预处理数据
  5. 得到答案
#include <iostream>
#include <vector>
using namespace std;int main() {int n , q;cin >> n >> q;//读入数据vector<long long > nums(n + 1);for(int i = 1 ; i < n + 1 ; i++ ){cin >> nums[i];}//预处理数据vector<long long > sum(n + 1);for(int i = 1 ;  i < nums.size() ;i++ ){//i 位置的和等于 i - 1 位置的和 加上 i 位置的值//如果数组大小为n 那 i 从 0开始 那么就会读入 nums[-1]就会报错sum[i] = sum[i - 1] + nums[i];}//得出结果while(q--){int n1 , n2;cin >> n1 >> n2;cout <<sum[n2] - sum[n1 - 1] << endl;}return 0;
}

这样提交:过啦!!!
这里有点像动态规划奥

3 牛客 DP35 【模板】二维前缀和

家人们跟上节奏!!!DP35 二维前缀和

题目描述

在这里插入图片描述

根据题目描述,这道题是刚才一维的升级版,我们需要计算一个指定矩阵的和。那么依然使用的是前缀和来进行预处理。这道题就要注意细节处理了

算法思路

首先最好想的就是暴力算法,求指定矩阵的和那么直接暴力求不就可以了?!但是毋庸置疑的是这样一定一定会超时,O(n^3)的暴力算法啊。

那么来看前缀和算法,这是一个解决这个问题的优秀算法。前缀和的思想很简单,就是对数组进行一遍预处理,得到每个数组位置之前所有数的和,然后在通过减法求得数据。

  1. 创建一个大小为 (n + 1) *( n + 1) 的矩阵(大小为 n + 1可以避免一些边界情况)
  2. 从 坐标(1,1) 开始读入数据
  3. 创建一个大小为 (n + 1) *( n + 1) 的 dp 矩阵
  4. 从 坐标(1,1)开始预处理数据
  5. 得到答案

这里的预处理就有说法了,这和线性的数组不一样,我们做一个图就可以很好理解预处理然后进行:
求(i,j)的矩阵和:
可以理解为(i-1,j)的矩阵和 加上 (i,j-1)的矩阵和,加上(i,j)的值再减去(i-1,j-1)的矩阵和(因为多加了一遍)
在这里插入图片描述
这样就可以进行预处理了:
然后我们还需要如何得到答案:
在这里插入图片描述
我们想要求以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和。
可以通过 (x2,y2) 矩阵和 减去(x2 , y1 - 1)矩阵和 减去(x1 - 1 , y2)矩阵和 加上(x1 - 1, y1 - 1)的矩阵和(因为多减了一遍)

#include <iostream>
#include <vector>
#define int long longusing namespace std;signed main() {int n , m ,q;cin >> n >> m >> q;//创建二维数组 匿名对象构造vector<vector<int>> nums(n + 1 , vector<int>(m + 1));for(int i = 1 ; i <= n ; i++ )for(int j = 1 ; j <= m ; j++)cin>>nums[i][j];//进行前缀和计算vector<vector<int>> dp(n + 1 , vector<int>(m + 1));for(int i = 1 ; i <= n ; i++ )for(int j = 1 ; j <= m ; j++)dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + nums[i][j];int x1 , x2 , y1 ,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;
}

提交过啦!!!

Leetcode 724. 寻找数组的中心下标

跟上节奏:724. 寻找数组的中心下标

题目描述

在这里插入图片描述
这道题可谓是一维前缀和的变形了,我们来秒杀这个题目

算法思路

我们先进行一下前缀和的预处理,然后根据条件判断即可:

class Solution {
public:int pivotIndex(vector<int>& nums) {//预处理vector<int> dp(nums.size() + 1);for(int i = 1 ; i <= nums.size() ;i++){dp[i] = dp[i - 1] + nums[i - 1];}int ans = -1;//根据题目要求求得即可for(int i = 0 ; i < nums.size() ;i++){if(dp[i] == dp[nums.size()] - dp [i + 1] ){ans = i ;break;}}return ans;}
};

提交过啦!!!

Leetcode 238. 除自身以外数组的乘积

最后一道:238. 除自身以外数组的乘积

题目描述

在这里插入图片描述
注意到题目要求,我们看来是要使用前缀和来解决问题了。

算法思路

这道题的难点在于不能不能使用除法,而且还要进行O(n)的算法
那么如何进行呢???

  1. 很简单,我们在创建一个前缀乘积数组与一个后缀乘积数组,分开进行预处理即可。
  2. 然后按照对应位置,通过n - 1 的前缀乘积与 n + 1 的后缀乘积相乘 得到 除自身以外数组的乘积,就可以了。
class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> dpfront(n + 1);vector<int> dpback(n + 1);//细节处理,不能为0哦!!!dpfront[0] = 1;dpback[n]  = 1;//预处理for(int i = 1 ; i <= n ; i++){   //一次处理两个数组,提高效率dpfront[i] = dpfront[i - 1] * nums[i - 1];dpback[n - i] = dpback[n - i + 1] * nums[n - i];}//得到答案for(int i = 0 ; i < n ; i++){nums[i] = dpfront[i] * dpback[i + 1];}return nums;}
};

提交:过啦!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

react引入iconfont的svg图标

react引入iconfont的svg图标 本文目录 react引入iconfont的svg图标普通图标通过link引入css组件内引入css使用 svg图标通过script引入js组件内引入js使用 通过封装组件自定义封装组件中调用 通过antd封装使用 普通图标 通过link引入css <link rel"stylesheet" h…

基于springboot实现在线考试系统设计【项目源码+论文说明】计算机毕业设计

基于springboot实现在线考试管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不…

http 3.0 有哪些新特性

HTTP/3 是超文本传输协议&#xff08;HTTP&#xff09;的最新主要版本&#xff0c;其显著特点是放弃了传统的TCP作为传输层协议&#xff0c;转而采用基于UDP的QUIC&#xff08;Quick UDP Internet Connections&#xff09;协议。以下是HTTP/3利用QUIC实现高性能传输的关键特性&…

sketchup{su}安装错误1402

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展&#xff0c;输入1402&#xff0c;点击搜索 等待修复成功既可尝试重新安装su 软件每周六选择其他方式登录免费使用

微软github技术公开课(web开发、生成式AI、ML、数据科学、物联网)

一些微软在github上公开的课程整理&#xff1a; web开发基础入门 面向初学者的数据数据科学课程 https://microsoft.github.io/Data-Science-For-Beginners/#/ 面向初学者的AI入门课程 https://github.com/microsoft/ai-for-beginners 面向初学者的生成式AI课程 https://…

WordPress自动采集发布AutoPostPro汉化版插件

WP-AutoPostPro 是一款极为出色的WordPress自动采集发布插件&#xff0c;其显著优势在于能够从任何网站抓取内容并自动将其发布到你的WordPress网站上。它实现了对任何网页内容的自动采集和发布&#xff0c;整个采集过程完全自动化&#xff0c;无需手动操作。 项 目 地 址 &…

网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)

网络互连 网络互连: 将多台计算机连接在一起, 完成数据共享 数据共享的本质是网络数据传输, 即计算机之间通过网络来传输数, 也叫做网络通信 根据网络互连的规模不同, 将网络划分为局域网和广域网 注意: 局域网和广域网是相对的概念 局域网LAN 又称内网, 局域网和局域网之间在没…

生成式AI在B端产品的应用分析

AI产品发展到现在&#xff0c;消费端的产品应用还受到比较大的限制&#xff1b;但是在B端&#xff0c;已经有了不错的表现。作者总结了AI产品在B端的几款应用&#xff0c;一起来看看表现如何。 生成式AI在B端产品的应用分析© 由 ZAKER 提供 随着今年生成式AI应用的大范围…

Python基础06-日期和时间的操作方法

在Python中处理日期和时间是编程中常见的需求&#xff0c;无论是安排任务、记录日志还是分析数据。本文将介绍如何在Python中获取当前日期和时间、创建特定日期和时间、格式化日期和时间、解析字符串中的日期和时间、使用时间差、比较日期和时间、从日期/时间中提取组件、处理时…

2024年Java接单平台强力推荐!各个都知名!

Java这几年真卷飞了&#xff0c;一点都不夸张。因此&#xff0c;很多程序员朋友都已经试着转方向、换赛道了。试着接单、找私活就是一大途径。当然&#xff0c;特别是有技术、又有相对空闲时间的朋友&#xff0c;更值得一试。既是增加收入的捷径&#xff0c;又可以提升自我——…

在Milk-v Duo上部署YOLOV8模型

建议自己编译images固件&#xff0c;我使用官方给的固件在部署中出现了一些问题&#xff0c;请参考: 编译Milkv-duo固件-CSDN博客 下载YOLOv8 git clone https://github.com/ultralytics/ultralytics.git 下载yolo_export.zip 下载链接&#xff1a;链接&#xff1a;百度网盘…

mysql常见语法操作笔记

1. 数据库的基本操作 1.1. MYSQL登录与退出 D:\phpstudy_pro\Extensions\MySQL5.7.26\bin 输入 mysql -uroot -proot -h127.0.0.1 退出的三种方法 mysql > exit; mysql > quit; mysql > \q; 1.2. MYSQL数据库的一些解释 注意&#xff1a;数据库就相当于文件夹 …

Nacos的简介及安装和使用

Nacos的简介及安装和使用 1. Nacos简介1.1 核心特性1.2 常见的注册中心1.3 Nacos结构图 2. 如何安装和配置Nacos&#xff1f;2.1 Nacos的安装2.2 如何使用Nacos&#xff1f; 1. Nacos简介 ​ Nacos是一个开源的动态服务发现、配置和服务管理平台&#xff0c;由阿里巴巴开发和维…

南京邮电大学数学实验A答案 | 《MATLAB数学实验》第三版课后习题答案

数学实验A 本仓库收集了2024年我在学习《数学实验A》课程期间完成的作业。课程使用的教材为《MATLAB数学实验》第三版&#xff0c;作者为胡良剑和孙晓君教授。 这个资源库的建立初衷是为了帮助南京邮电大学的同学们在学习过程中有一个参考的依据&#xff0c;减少一些无端浪费…

OSPF虚连接

OSPF虚连接 虚连接&#xff08;Virtual link&#xff09;是指在两台ABR之间通过一个非骨干区域建立的一条逻辑上的连接通道。 根据RFC 2328&#xff0c;在部署OSPF时&#xff0c;要求所有的非骨干区域与骨干区域相连&#xff0c;否则会出现有的区域不可达的问题。但是在实际应…

模糊测试—AFL——实战小记

一 安装环境&#xff1a; 在vm虚拟机上使用Ubuntu-22.04系统的镜像。 清华和科大的镜像都可以&#xff0c;下载下来的是ISO的压缩包&#xff0c;不用解压&#xff08;出来的是一堆文件&#xff09;&#xff0c;在安装新的VM虚拟机时&#xff0c;在镜像源里面直接选择下载下来…

【学习笔记二十四】EWM补货策略和自动补货配置

一、EWM补货策略概述 1.计划补货 ①以联机或批处理模式启动 ②根据最大和最小数量计算补货 ③仅当库存量低于最低数量时才开始 ④四舍五入至最小补货数量的倍数 2.自动补货 ①在WT确认期间启动 ②根据最大和最小数量计算补货 ③只有当库存量低于最低数量时才开始 ④四舍…

MySQL Prepared语句(Prepared Statements)

在数据库应用中&#xff0c;很多SQL语句都会重复执行很多次&#xff0c;每次执行可能只是where条件中的变量值不同&#xff0c;但MySQL依然会解析SQL语法并生成执行计划。对于这类情况&#xff0c;可以利用prepared语句来避免重复解析SQL的开销。 文章目录 一、prepared语句优…

Java——继承与组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。 继承表示对象之间是is-a的关系&#xff0c;比如&#xff1a;狗是动物&#xff0c;猫是动…

模板(二)

文章目录 模板&#xff08;二&#xff09;1 非类型模板参数2. 模板的特化2.1. 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板的分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 模板&#xff08;二&…