前缀和(3)_寻找数组的中心下标

news2024/9/27 19:27:43

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

前缀和(3)_寻找数组的中心下标

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 题目链接 :

2. 题目描述 :

3. 解法(一维前缀和) :

算法思路:

代码展示:

结果分析:


1. 题目链接 :

OJ链接: 寻找数组的中心下标

2. 题目描述 :

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

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

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

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:

输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。

示例 3:

输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。

提示:

  • 1 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

3. 解法(一维前缀和) :

算法思路:

从中心下标的定义可知,除中心下标的元素之外,该元素左边的[前缀和]等于该元素右边的[后缀和].

        因此,我们可以先预处理出来两个数组,一个表示前缀和,另一个表示后缀和.

        然后,我们可以用一个for循环枚举可能的中心下标,判断每一个位置的[前缀和]以及[后缀和],如果二者相等,就返回当前下标.

代码展示:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n = nums.size();

        vector<int> front_dp(n);
        vector<int> back_dp(n);

        //边界问题
        front_dp[0] = 0;
        back_dp[n - 1] = 0;
        
        //前缀和
        for(int i = 1; i < n; i++)
            front_dp[i] = front_dp[i - 1] + nums[i - 1];
 
        //后缀和
        for(int i = n - 2; i >= 0; i--)
            back_dp[i] = back_dp[i + 1] + nums[i + 1];

        for(int i = 0; i < n; i++)
            if(front_dp[i] == back_dp[i]) return i;
        return -1;
    }
};

 注意:

这里数组下标是从0开始,我们求前缀和后缀和时要注意边界问题:

我们这里提前初始化了0,n - 1这里的值,然后分别从1,n - 2开始求前后缀和

 

结果分析:

1. 时间复杂度:

构建前缀和 front_dp 和后缀和 back_dp 各需 O(n) 时间,因此整体时间复杂度为 O(n)。
2. 空间复杂度 :

使用了两个额外的数组 front_dp 和 back_dp,各占 O(n) 空间,总空间复杂度为 O(n)。这可以优化到 O(1) 使用变量替代数组。
3. 逻辑 :

初始化 front_dp[0] 和 back_dp[n - 1] 为 0,表示没有元素时的和。
front_dp[i] 计算的是 nums 中第 i 个元素之前的所有元素的和。
back_dp[i] 计算的是 nums 中第 i 个元素之后的所有元素的和。
4. 边界条件 :

如果数组为空,则没有 pivot index,函数将返回 - 1。
代码假定至少有一个元素。
5. 查找 :

最后遍历 front_dp 和 back_dp,找出左侧和等于右侧和的索引。

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

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

相关文章

hackbar 插件安装(google版)

hackbar下载&#xff08;github&#xff09; 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/19 18:17 HackBar 是一个辅助进行网络渗透测试和安全评估的浏览器插件。它提供了一系列快捷工具和功能&#xff0c;可以帮助用户执行各种网络攻击和测试&#xff0c;包括 XS…

Linux宇宙-1

1.Linux的前世今生 1.计算机 根据摩尔定理&#xff0c;计算机快速向小型化和高性能化发展。 计算机私人公司也是蓬勃发展&#xff0c;包括面向企业的大型计算机&#xff1a;IBM&#xff1b;面向个人的计算机&#xff1a;苹果&#xff0c;微软和英特尔&#xff1b; 由于计算…

MySQL高阶1965-丢失信息的雇员

目录 题目 准备数据 分析数据 实现 题目 编写解决方案&#xff0c;找到所有 丢失信息 的雇员 id。当满足下面一个条件时&#xff0c;就被认为是雇员的信息丢失&#xff1a; 雇员的 姓名 丢失了&#xff0c;或者雇员的 薪水信息 丢失了 返回这些雇员的 id employee_id &…

定制几何尺寸组合测量仪 提高利用率 降低成本!

几何尺寸种类也包括很多类型&#xff0c;外径、圆度、长度、宽度、厚度、直线度等等均在其中&#xff0c;而通常的测量仪都是单一尺寸测量仪&#xff0c;但同一产品需要检测的尺寸往往不止一种&#xff0c;多台测量仪的应用会增加成本、增加占地面积&#xff0c;因此定制几何尺…

Java面向对象(二)(类的方法)(自己学习整理的资料)

目录 一.带参方法 带1个参数的方法 带2个参数的方法 带3个参数的方法 数组作为参数 &#xff08;图书管理系统&#xff09; 递归方法 二.简易银行存取款功能 一.带参方法 语法 <访问修饰符>返回类型<方法名>(<形式参数列表>){ //方法的主体 } 带1…

C++——认识STL及使用及实现第一个容器string

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1. 什么是STL 1.1 STL的版本 STL(standard template libaray-标准模板库)&…

垃圾回收级别分类识别系统源码分享

垃圾回收级别分类识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

【线程】线程的同步---生产消费者模型

本文重点&#xff1a;理解条件变量和生产者消费者模型 同步是在保证数据安全的情况下&#xff0c;让我们的线程访问资源具有一定的顺序性 条件变量cond 当一个线程互斥地访问某个变量时&#xff0c;它可能发现在其它线程改变状态之前&#xff0c;它什么也做不了&#xff0c;…

电路 - 笔记2

1 555 芯片 2 类比 - pU*I 与 Fm*a 是不是可以与牛顿定律类比 - Fm*a 人的力量&#xff08;F&#xff09;有限。 当推大箱子&#xff08;m&#xff09;时&#xff0c;加速度&#xff08;a&#xff09;就不会很大 当推小箱子&#xff08;m&#xff09;时&#xff0c;加速度…

RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!

所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0c;如何构建高可用的云边端协同架构&#xff1f; 语音 AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频的爆炸增长&#xff0c;给新一代编解码技术提出了什么新挑战&#xff1f; 当大模型进化到实时多模态&am…

mysql批量修改表前缀

现有表前缀xh,批量修改为fax_需要怎么做 SELECTCONCAT(ALTER TABLE ,table_name, RENAME TO fax_,substring(table_name, 3),;) FROMinformation_schema. TABLES WHEREtable_name LIKE xh_%; 运行之后可以但是生成了一批修改表明的命令 此时批量复制执行就可实现批量修改表前…

架构设计读后有感——原则

成为架构时是程序员的梦想&#xff0c;并不意味着把编程做好就能够自然的成为一个架构师&#xff0c;他们之间有一个鸿沟->“不确定性” 不确定性&#xff1a;编程本质上说是不存在不确定性的&#xff0c;因为一个输入可以通过逻辑的运算得到确定的值&#xff0c;即使是机器…

电脑ip变了后导致原来的虚拟机静态ip失效问题

电脑ip变了后导致原来的虚拟机静态失效问题处理 静态IP设置的几个要点 查看本地网络的配置 VMware虚拟机网络设置 子网IP必须和本地ip在同一个网段下&#xff0c;本地的ip是192.168.1.10&#xff0c;那我子网ip就应该是192.168.1.xxx&#xff0c; 网关ip需要保持一致。 DHCP…

剧本杀分类管理

1用户界面 用户注册/登录模块与剧本杀填写模块&#xff1a;用户注册/登录成功后&#xff0c;将用户信息传递给剧本杀填写模块&#xff0c;以便用户进行剧本杀的填写。 图6-1登录注册 剧本杀填写模块与剧本杀分类管理模块&#xff1a;剧本杀填写完成后&#xff0c;将剧本杀信息…

Adaptive Object Detection with Dual Multi-Label Prediction

gradient reversal layer (GRL) 辅助信息 作者未提供代码

小孩真的需要手机上学吗?怎样远程了解他在学校用iPhone干什么?

互联网在教育、娱乐、社交等多个领域发挥着重要作用&#xff0c;成为孩子们获取知识、放松娱乐的重要渠道。孩子们首次接触互联网的年龄越来越小&#xff0c;有的甚至在幼儿园阶段就开始使用智能设备。 一些学校推行电子书包、网络作业等&#xff0c;虽然提高了效率&#xff0c…

【Golang】Go语言中如何面向对象?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Vue3:toRaw与markRaw

目录 一.toRaw 1.性质 2.作用 二.markRaw 1.性质 2.作用 三.toRaw的使用 四.markRaw的使用 五.代码示例 在Vue 3中&#xff0c;toRaw和markRaw是两个用于处理响应式对象的全局函数。 一.toRaw 1.性质 toRaw是一个全局函数&#xff0c;它接受一个由reactive或ref生成…

JS面试真题 part6

JS面试真题 part6 26、如何判断一个元素是否在可视区域中27、什么是单点登录&#xff1f;如何实现28、 如何实现上拉加载&#xff0c;下拉刷新29、说说你对正则表达式的理解&#xff1f;应用场景&#xff1f;30、说说你对函数式编程的理解&#xff1f;优缺点 26、如何判断一个元…

Vue74 路由的props配置

笔记 ​ 作用&#xff1a;让路由组件更方便的收到参数 {name:xiangqing,path:detail/:id,component:Detail,//第一种写法&#xff1a;props值为对象&#xff0c;该对象中所有的key-value的组合最终都会通过props传给Detail组件// props:{a:900}//第二种写法&#xff1a;props…