【刷题】前缀和入门

在这里插入图片描述

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

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


前缀和入门

  • 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 long

using 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♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度

104.二叉树的最大深度 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/ 什么是二叉树的深度和高度&#xff1f; 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度…

C语言 三目运算符

C语言 逻辑分支语句中 还有一种 三目运算符 我们编写代码如下 #include <stdio.h>int main() {const char* a 1 1 ? "表达式1" : "表达式2";printf("%s", a);return 0; }这里 我们根据逻辑 先定义一个a 然后 它的值 等于一个 三目运算…

AIGC时代之 - 怎样更好的利用AI助手 - 指令工程

爆火的AIGC 2022年11月30日&#xff0c;OpenAI发布ChatGPT 3 2022年12月4 日&#xff0c;ChatGPT 3 已拥有超过一百万用户 2023年各种大语言模型开始火爆全球 GPT们&#xff0c;已经成为了我工作和学习的非常重要的工具。 ChatGPT也没那么神奇&#xff1f; 不知道大家有没有…

web--验证码识别,找回密码

验证码前端回显 当我不知道验证码 查看数据包就可以知道验证吗在数据包之中 burp爆破 &#xff08;前提是没有次数限制&#xff09; 更改返回数据 将成功的回显值更改 验证码更改脚本&#xff08;智能识别&#xff09; 错误的&#xff1a;只要输入一次对了&#xff0c;在bp…

OFDM-OCDM雷达通信一体化信号模糊函数对比研究【附MATLAB代码】

文章来源&#xff1a;微信公众号&#xff1a;EW Frontier 1.引言 为提高频谱利用率并实现系统小型化、集成化,近年来雷达通信一体化系统成为重要研究方向。正交线性调频波分复用(OCDM)信号是利用菲涅尔变换形成的一组正交线性啁啾(chirp)信号,基于OCDM 的雷达通信一体化信号不…

【重要】Heygen订阅指南和用法详解!让照片学说话?一张照片变演讲?Heygen订阅值得吗?

常见问题 Q&#xff1a;Heygen是什么&#xff1f;Heygen是什么玩意&#xff1f; A&#xff1a;Heygen是一款由AI视频工具,创作者只需要上传视频并选择要翻译的语言&#xff0c;该工具可实现自动翻译、调整音色、匹配嘴型。为了方便理解&#xff0c;笔者利用Heygen制作了一个AI视…

C语言中字符串函数以及内存函数的使用和注意事项

目录 0. 前言 1、求字符串长度函数 1.1、strlen 模拟实现 2.长度不受限制的字符串函数 2.1 strcpy 模拟实现 2.2strcat 模拟实现 2.3strcmp 模拟实现 3.长度受限制的字符串函数 3.1strncpy 3.2strncat 3.3strncmp 4、字符串查找函数 4.1strstr 模拟实现 3.2strt…

【C/C++笔试练习】线程作用、磁盘的固定块、多进程、进行调度、cache、内存抖动、非抢占CPU调度、inode描述、文件操作、进制、最难的问题、因子个数

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;线程作用&#xff08;2&#xff09;磁盘的固定块&#xff08;3&#xff09;多进程&#xff08;4&#xff09;进行调度&#xff08;5&#xff09;cache&#xff08;6&#xff09;内存抖动&#xff08;7&#xff09;非抢占…

一台服务器同时启动两个版本jdk

之前Java项目都是1.8的jdk&#xff0c;在服务器部署正常使用&#xff0c;服务器配置环境变量jdk1.8版本。最近一次我用了jdk17版本&#xff0c;部署服务器后&#xff0c;遇见了jdk版本不一致报错 报错内容&#xff1a; 52指向jdk1.8,61指向jdk17&#xff0c;大概就是jdk版本不…

第十六届“华中杯”B 题使用行车轨迹估计交通信号灯周期问题

某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期,以便为司机提供更好的导航服务。由于许多信号灯未接入网络,无法直接从交通管理部门获取所有信号灯的数据,也不可能在所有路口安排人工读取信号灯周期信息。所以,该公司计划使用大量客户的行车轨迹数据估计交通…

条件编译 #和##运算符

目录 1. #运算符2. ##运算符3. 条件编译4. 题目分享总结 正文开始 前言: 本章为C语言语法完结撒花, 下文将进行C语言中#和##操作符以及条件编译的讲解, 来进一步让我们了解C语言. 作者主页: 酷酷学!!! 1. #运算符 #运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带…

牛客社区所有的表和SQL语句

文章目录 1 帖子表 discuss_post1.1 字段描述1.2 相关功能描述1.2.1 分页查询帖子1.2.2 查询帖子总数量1.2.3 插入一条帖子记录1.2.4 根据帖子ID查询某条帖子1.2.5 更新帖子评论数量1.2.6 更新帖子类型1.2.6 更新帖子状态1.2.7 更新帖子分数 2 用户表 user2.1 字段描述2.2 相关…

cesium primitive 移动 缩放 旋转 矩阵

旋转参考&#xff1a;cesium 指定点旋转rectangle Primitive方式 矩阵篇-CSDN博客 平移参考&#xff1a;cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵-CSDN博客 一、primitive方式添加polygon let polygonInstance new Cesium.GeometryInstance({geometry: Ce…

陆金所控股一季报到底是利好还是利空?

3月底&#xff0c;陆金所控股&#xff08;LU.N;06623.HK&#xff09;因其特别分红方案受到市场高度关注。但在4月23日发布的2024年一季度财报中&#xff0c;陆金所控股营收同比下降30.9%&#xff0c;净亏损8.3亿元。 两者对比&#xff0c;外界不由得对公司的经营状况产生疑惑。…

ROS 话题订阅模型之自定义消息类型 C++实现

ROS 话题订阅模型之自定义消息类型 1.自定义消息类型好处 ROS提供了许多标准的消息类型&#xff0c;如 std_msgs/String、sensor_msgs/Image 等&#xff0c;涵盖了很多常见的数据类型和传感器数据。但是&#xff0c;在实际的开发中&#xff0c;我们经常会遇到需要传输的数据类…

【Image captioning】论文阅读九—Self-Distillation for Few-Shot Image Captioning_2022

摘要 大规模图像字幕数据集的开发成本高昂,而大量未配对的图像和文本语料库可能有助于减少手动注释的工作。在本文中,我们研究了只需要少量带注释的图像标题对的少样本图像标题问题。我们提出了一种基于集成的自蒸馏方法,允许使用不成对的图像和字幕来训练图像字幕模型。该…

springcloud alibaba 整合seata的TCC

一、seata服务端搭建同上篇。 Seata的AT模式客户端两阶段提交流程源码分析 二、seata客户端的结构 1.示例DEMO工程 下单&#xff0c;扣余额&#xff0c; 减库存。 2. MAVEN配置。 父工程&#xff1a;由于spring-cloud-starter-alibaba-seata依赖的seata-spring-boot-starter…

C语言(static和extern)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

Python写个二维码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、进入官网下载 官网 pip insta…

FR-E840-0120-4-60 三菱变频器5.5KW型

FR-E840-0120-4-60 三菱变频器替换FR-E740-5.5K FR-E840用户手册,FR-E840-0120-4-60价格,FR-E840-5.5K价格,FR-E840-0120-4-60外部连接图,FR-E740-5.5K替换产品。 FR-E740-5.5K-CHT逐渐开始停产&#xff0c;现在用新型号FR-E840-0120-4-60替换。 FR-E840-0120-4-60参数说明&…