【优选算法专栏】专题四:前缀和(二)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题四

  • 寻找数组中心下标
    • 算法原理:
  • 除自身以外数组的乘积
    • 算法原理:

寻找数组中心下标

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
在这里插入图片描述

算法原理:

分析题目,既然要找到数组中心下标,我们先假设数组中心为 i i i,那么 i i i就将数组分成两部分,只要i前面部分的和等于i后面的和,那么此时i就是数组中心,反之就没有数组中心。

前面部分的和我们是可以通过前缀和计算出来的,那么后面的和怎么算呢?其实既然前缀和计算的是前面部分的和,那么后面部分的和我们可以用后缀和来进行计算。

在这里插入图片描述

接下来我们要预处理前缀和和后缀和数组:

f[i]表示:[0,i-1]区间所有元素的和。
g[i]表示:[i+1,n-1]区间所有元素的和。

接下来递推:
在这里插入图片描述

要想算[0,i-1]区间的和,那么我们可以先算[0,i-2]区间的和再加上[i-1]本身的值。
那么也就是:
f [ i ] = f [ i − 1 ] + n u m s [ i − 1 ] f[i]=f[i-1]+nums[i-1] f[i]=f[i1]+nums[i1];
同理:
g [ i ] = g [ i + 1 ] + n u m s [ i + 1 ] g[i]=g[i+1]+nums[i+1] g[i]=g[i+1]+nums[i+1];
在这里插入图片描述
下来使用前缀和数组:
在这里插入图片描述

要想求数组中心,那么我们只用判断 f [ i ] = = g [ i ] f[i]==g[i] f[i]==g[i]即可,要是相等数组中心就是i位置,反之就是不存在。

介绍到这,原理基本上其实已经就完了,但是在写代码之前还要注意一下细节问题:

为方式越界访问

当下标为0时, f [ 0 ] = f [ − 1 ] + n u m s [ 0 ] f[0]=f[-1]+nums[0] f[0]=f[1]+nums[0];为防止这种情况,我们要让f[0]=0,不影响原始值。

同理,当下标为n-1时, g [ n − 1 ] = g [ n ] + n u m s [ n − 1 ] g[n-1]=g[n]+nums[n-1] g[n1]=g[n]+nums[n1];为防止这种情况,我们要将g[n-1]=0;
当然因为f[i]表示前缀和,因此填表顺序从左往右,相反g[i]填表顺序型右往左。

代码实现:

class Solution 
{
public:int pivotIndex(vector<int>& nums) {int n=nums.size();vector<int> f(n),g(n);//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++){if(f[i]==g[i])return i;}return -1;}
};

除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

在这里插入图片描述

算法原理:

解法一:暴力+枚举
在这里插入图片描述
我们模拟一下题目的行为,每算一个下标,通过暴力枚举的方式将乘积乘起来。但是这样时间复杂度是 O ( N 2 ) O(N ^2) O(N2)显然会超时。

解法二:前缀和

根据第一题的经验,其实这道题跟第一题基本一模一样。
还是将数组分成两部分:
在这里插入图片描述
要想计算i位置除i位置其余的乘积,i将数组分成两部分,我们将i位置之前和之后的乘积分别算出来,然后在乘起来就是最终结果。

因此还是用两个数组分别是前缀积和后缀积:

f[i]表示:从[0,i-1]区间内所有元素的乘积。
g[i]表示:从[i+1,n-1]区间内所有元素的乘积。

接下来推递推式子:
有了第一题的经验,本题式子很好推。
f [ i ] = f [ i − 1 ] ∗ n u m s [ i − 1 ] f[i]=f[i-1]*nums[i-1] f[i]=f[i1]nums[i1];
g [ i ] = g [ i + 1 ] + n u m s [ i + 1 ] g[i]=g[i+1]+nums[i+1] g[i]=g[i+1]+nums[i+1];

使用前缀和数组:
要想拿到i位置的结果,那么我们直接让我们的前缀积和后缀积相乘即可,也就是:
i->f[i]*g[i];

为防止越界,f[0]和g[n-1]要进行初始化,但是此时不能初始化为0,要初始化为1,因为要不影响结果值。

填表顺序:
f[i]:从左往右
g[i]:从右往左;

代码实现:

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

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

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

相关文章

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中&#xff0c;外观模式是一种常用的结构型设计模式&#xff0c;旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口&#xff0c;这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

网络管理实验二、SNMP服务与常用的网管命令

1 常用的网管命令 1.1 网络状态监视命令 包括以下命令&#xff1a;Ipconfig、ping、nslookup、dig、host ipconfig 作用&#xff1a;用来显示本机所有网卡的基本信息&#xff08;IP、掩码、网关、工作状态&#xff09;&#xff1b;用法&#xff1a;ipconfig展示&#xff1a;…

分类算法(数据挖掘)

目录 1. 逻辑回归&#xff08;Logistic Regression&#xff09; 2. 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 3. 决策树&#xff08;Decision Tree&#xff09; 4. 随机森林&#xff08;Random Forest&#xff09; 5. K近邻&#xff08;K-Nearest …

ARM/X86+FPGA轨道交通/工程车辆行业的解决方案

深圳推出首条无人驾驶地铁—深圳地铁20号线&#xff0c;可以说是深圳地铁的一次开创性的突破。智能交通不断突破的背后&#xff0c;需要很严格的硬件软件等控制系 统&#xff1b;地铁无人驾驶意味着信号系统、通信系统、综合监控系统、站台屏蔽门工程等项目必须严格执行验收。…

浦大喜奔APP8.0智能升级,发力数字金融深化五大金融篇章服务

1. 浦大喜奔立足科技赋能持续迭代升级&#xff0c;筑牢用户体验护城河 浦发信用卡中心坚持数字科技与客户体验双轮驱动&#xff0c;以科技赋能发展&#xff0c;优化整体系统性能&#xff0c;全方位支撑浦大喜奔 APP提高线上客户服务能力与体验&#xff0c;积极服务民生消费&a…

项目——boost搜索引擎

今天我们来写一个boost搜索引擎&#xff01; &#xff08;后续如果有更新&#xff0c;这个博客也会更新&#xff09; gitee连接:boost搜索引擎: boost搜索引擎 首先我们要介绍一下我们这个项目&#xff0c;我们项目的目的是通过我们的搜索引擎能够通过关键字查找到对应的网页…

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-2

NVME SSD电源状态判断 通过pciehp sysfs接口对NVMe SSD所在的PCIe插槽进行Power On/Off操作时&#xff0c;确实会间接影响到NVMe SSD本身的电源状态。因为NVMe SSD是作为PCIe设备连接到特定插槽上的&#xff0c;插槽电源状态的变化通常会直接影响到与其相连的设备。 当对PCIe…

缓存雪崩、缓存击穿、缓存穿透

缓存雪崩、缓存击穿、缓存穿透 文章目录 缓存雪崩、缓存击穿、缓存穿透缓存雪崩缓存击穿缓存穿透 缓存雪崩 当大量缓存数据在同一时间过期&#xff08;失效&#xff09;或者Redis宕机&#xff0c;如果此时有大量的用户请求&#xff0c;都无法在 Redis 中处理&#xff0c;于是全…

Http响应报文介绍

所有HTTP消息(请求与响应)中都包含&#xff1a; 一个或几个单行显示的消息头(header)&#xff0c; 在消息头部分主要包含&#xff1a;响应行信息和响应头信息 一个强制空白行&#xff1b; 最后是响应消息主体&#xff1b; 以下是一个典型的HTTP响应: HTTP/1.1 200 OK -- 响…

多叉树题目:收集树上所有苹果的最少时间

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;收集树上所有苹果的最少时间 出处&#xff1a;1443. 收集树上所有苹果的最少时间 难度 6 级 题目描述 要求 给定一个有 n \texttt{n} n 个结点的…

Linux系统启动过程详解

启动过程是指计算机从开机自检到操作系统完全加载的一系列动作。深入理解启动过程对于有效解决启动问题、提升系统性能以及高效管理系统的启动组件至关重要。例如&#xff0c;可以帮助我们识别和处理在启动过程中可能出现的诸如硬件故障、配置错误等问题。例如帮助我们个性化定…

计算机组成原理【CO】Ch4 指令系统

文章目录 考纲第四章 指令系统4.1 指令格式4.2 指令的寻址方式4.3 程序的机器级代码表示4.4 CISC和RISC的基本概念 【※】扩展码指令计算【※】指令系统【指令格式】【※】指令的寻址方式【※】指令的机器级代码表示x86汇编指令&#xff08;重点关注 intel 格式&#xff09;MIP…