“前缀和”专题篇一

news2024/11/15 23:20:34

目录

【模版】前缀和

【模版】二维前缀和

寻找数组的中心下标

除自身以外数组的乘积


【模版】前缀和

题目

思路

这道题如果使用暴力解法,即针对每次查询,先算出前r个数的总和,然后再算出前l-1个数的总和,然后相减就得出本次查询的结果,但是这样的话,时间复杂度是O(N*Q),会超时,因此需要别的方法来解决。

下面使用“前缀和”来解决这道题,即先算出每个位置(含该位置)之前所有数的总和,使用一个数组存储起来,然后针对每次查询就可以使用O(1)的时间复杂度得到结果。

代码

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n,q;
    cin>>n>>q;
    vector<int> arr(n+1);
    for(int i=1;i<=n;i++)
        cin>>arr[i];
    vector<long long> dp(n+1);
    for(int i=1;i<=n;i++)
        dp[i]=dp[i-1]+arr[i];
    int l,r;
    while(q--){
        cin>>l>>r;
        cout<<dp[r]-dp[l-1]<<endl;
    }
    return 0;
}
【模版】二维前缀和

题目

思路

这道题如果使用暴力解法的话,即针对针对查询,算出本次查询的区域,然后再计算出该区域所有数的和,但是这种方法的时间复杂度是O(N*M*Q),是会超时的,因此需要别的方法来解决。

下面将依旧使用“前缀和”的思想来解决这道题,即预先计算出每个位置和左上角构成的矩形的值的总和,针对每次查询,就可以使用O(1)的时间复杂度计算出所查询区域的值的总和。

【1】计算好每个位置和左上角构成的矩形的值的总和

【2】计算出所查询区域的值的总和

代码

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n,m,q;
    cin>>n>>m>>q;
    vector<vector<int>> arr(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)
        for(int j=1;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-1][j]+dp[i][j-1]+arr[i][j]-dp[i-1][j-1];
    int x1,y1,x2,y2;
    while(q--){
        cin>>x1>>y1>>x2>>y2;
        cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;
    }
    return 0;
}
寻找数组的中心下标

题目

思路

使用“前缀和”来解决这道题,不过要计算一个前缀和数组f和一个后缀和数组g,前缀和数组f[i]表示当前位置之前所有元素的和,后缀和数组g[i]表示当前位置之后所有元素的和,然后遍历每个位置,看该位置的前缀和和当前位置的后缀和是否相等。

代码

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n=nums.size();
        vector<int> f(n);
        vector<int> g(n);
        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++)
            if(f[i]==g[i]) return i;
        return -1;
    }
};
除自身以外数组的乘积

题目

思路 

解决这道题使用类似于“前缀和”思想的“前缀积”和“后缀积”,使用数组f计算从开始位置到当前位置之前所有元素的乘积,使用数组g计算从末尾到当前位置的下一个位置的乘积,分别计算该位置之前所有元素的乘积以及该位置之后所有元素的乘积,然后遍历整个数组,计算出每个位置除自身以外数组的乘积。

代码

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int> f(n);
        vector<int> g(n);
        f[0]=g[n-1]=1;
        vector<int> ret(n);
        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;
    }
};

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

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

相关文章

2.类和对象(上)

1. 类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{ }中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; &#xff08;类和结构体非常像&#…

12-利用Excel创建IC类元件库

1.新建excel文件 2.找到模型向导 3.修改属性

技术速递|.NET Aspire 8.1 中面向云原生开发人员的新增功能!

作者&#xff1a;Mitch Denny 排版&#xff1a;Alan Wang 5 月份&#xff0c;我们向全世界发布了 .NET Aspire 的第一个正式版本。.NET 社区的热烈响应令我们深受鼓舞&#xff0c;在大家首次试用时&#xff0c;我们一直在积极倾听并与开发人员互动。 今天&#xff0c;我们很高…

EF Core连接PostgreSQL数据库

PostgreSQL数据库介绍 PostgreSQL是一个功能强大的开源对象关系型数据库管理系统&#xff08;RDBMS&#xff09;。最初于1986年在加州大学伯克利分校的POSTGRES项目中诞生&#xff0c;PostgreSQL以其稳定性、灵活性和扩展性而著称。它支持丰富的数据类型、复杂的查询、事务完整…

C语言进阶(3)

1.数组传参 一维数组传参的时候使用数组名&#xff0c;代表数组首元素的地址&#xff1b;函数接受时形参可以是数组形式&#xff0c;也可能是指针形式&#xff0c;数组形式比较简单数组怎么写&#xff0c;函数接受是就怎么接受,使用指针就要将指针类型写清楚&#xff0c;如下 …

一文搞懂MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系

MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM各个系统到底是什么意思&#xff1f;今天一文就给大家分享&#xff01; 在企业管理中&#xff0c;各种信息系统扮演着至关重要的角色&#xff0c;它们如同企业的神经系统&#xff0c;确保各个部分高效协同运作。 MES&#…

微信小程序项目开发【从0到1~入门篇】

创建第一个小程序 1、小程序简介2、第一个小程序&#xff1a;注册小程序开发账号3、第一个小程序&#xff1a;安装开发者工具3.1 了解微信开发者工具3.2下载安装3.3 扫描登录 4、创建小程序项目5、小程序代码的构成5.1json配置文件5.2WXML模板5.3WXSS样式5.4JS 逻辑交互 6、宿主…

HDMI线连接显示器后色彩灰暗问题解析与解决方案

随着科技的快速发展&#xff0c;HDMI线已成为连接电脑与显示器的重要工具。然而&#xff0c;当HDMI线连接显示器后&#xff0c;有时会遇到显示器色彩灰暗的问题。本文将针对这一问题进行深入解析&#xff0c;并提供相应的解决方案。 一、HDMI线连接显示器后色彩灰暗的原因 1. …

C++ SQL ORM

测试代码 // // Created by www on 2024/8/7. // #include "sqlitepp/database.h" #include "sqlitepp/condition.h"#include <iostream> using namespace sqlitepp; using namespace sqlitepp::literals;enum class test_enum {hello };void test…

Matplotlib | 绘制折线图

目录 简介安装 Matplotlib开始绘制简单折线图改变线的样式改变节点的样式添加图表文字改变坐标轴标签改变坐标数值范围绘制多条折线实践&#xff1a;绘制温度变化图 简介 折线图&#xff08;Line Chart&#xff09;&#xff0c;是一种以折线来呈现数据随时间变化而变化的图表。…

上翘机头设计确保了机器人在与杆子正面碰撞后,平稳从水平飞行状态重新调整为垂直飞行状态,进而用翅膀紧紧抱住杆子,实现稳定的栖息

带翼无人驾驶飞行器&#xff08;UAV&#xff09;因其出色的单位质量续航能力&#xff0c;特别适用于远距离任务&#xff0c;如送货、测绘和搜索救援。然而&#xff0c;与有翼飞行动物相比&#xff0c;它们在复杂结构上的着陆或栖息能力受限&#xff0c;难以执行检查、操作、监控…

for循环中的setTimeout的几种情况

for循环中的setTimeout的几种情况 在做js相关的题目时&#xff0c;经常会遇到以下几种容易混淆的setTimeout相关的题目&#xff1a; 第一种 for(var i0;i<10;i){setTimeout(console.log(i),0); }在这个代码片段中&#xff0c;setTimeout 的第一个参数是 console.log(i)&…

Qt QTableWidget 去除序号列

ui->tableWidget->verticalHeader()->setHidden(true);//垂直序列号&#xff08;表左侧&#xff09;ui.tableWidget->horizontalHeader()->setHidden(true);//水平序列号&#xff08;表上方&#xff09;删除后效果图&#xff1a;

Aurora64B 66B IP的原理及示例工程分析(高速收发器二十四)

点击进入高速收发器系列文章导航界面 1、Aurora 64B/66B原理 Aurora 64B/66B的原理与Aurora 8B/10B的原理基本上一致&#xff0c;通道概述如下所示。 图1 Aurora 64B/66B概述 上图的Aurora 64B/66B Core就是该IP&#xff0c;一个IP可以驱动多个高速收发器&#xff0c;该内核的主…

虚拟机(VMware16)安装rocky9.2详细过程,附镜像下载链接

rocky官方站点 链接: 官方站点 rocky9.2镜像下载路径 链接: Rocky-x86_64-dvd.iso 打开虚拟机&#xff0c;选择新建虚拟机 新建虚拟机 选择典型 由于VMware16没有rocky的版本&#xff0c;所以我们这里选择其他liunx 5.x 内核 64位 因为rocky9默认内核版本就是5开头的&#xf…

高频焊机逆变电路谐波计算及分析

一、SPWM谐波分析 简化高频焊机逆变模块为图4-6的单相PWM逆变电路。它由一个大小为u0的直流电压源和两个桥臂组成&#xff0c;每个桥臂包括两个MOSFET全控器件&#xff0c;阻抗Z模块为逆变输出负载[26]。逆变控制器的控制算法为双极性SPWM算法&#xff0c;即通过正弦调制波和三…

Unity Addressables bundle依赖查看和资源重复查看工具

在开发的过程有时候想要知道addressables 打包出来bundles的依赖关系&#xff0c;以及资源的重复情况。直接通过自带的addressables工具查看有点困难。这里分享一个github上的开源工具。名称为UnityAddressablesBuildLayoutExplorer。该工具可以帮助查看所有文件的依赖情况&…

在Visual Studio/Qt Creator 中使用CMake安装和使用vcpkg包

文章目录 0. vcpkg简介和安装0.1 vcpkg简介0.2 vcpkg安装0.2.1 如何在Visual Studio 2022以及以上版本中安装vcpkg0.2.2 在其他VS版本或Qt Creator等平台上中安装vcpkg 1. 在Visual Studio 中使用CMake安装和使用vcpkg包1.1 创建Visual Studio项目1.2 设置项目文件a. 配置CMake…

线性方程组迭代算法的Python实现

更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xff1a; ABAQUS数值模拟相关Python科学计算开源框架&#xff0c;编程…

pip 安装 scikit-learn

第一步&#xff1a;更新pip 可以首先执行 python -m ensurepip 然后执行 python -m pip install --upgrade pip 即可更新完毕。 python -m ensurepip python -m pip install --upgrade pip第二步 安装sklearn的时候一定要注意顺序。 安装顺序&#xff1a;numpy / scipy / ma…