前缀和/前缀和+后缀和?!!:瞬秒Leetcode 742.寻找数组的中心下标

题目

给你一个整数数组 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 。

阅读题目求一个下标左右两边和是否相等,一眼顶真前缀和没跑,接下来分为两个思路来解决此问题:解法一中规中矩使用完全的前缀和来解决,解法二使用前缀和加后缀和更加需要对前缀和思想有深刻的理解

前缀和思路

前缀和是什么:前缀和一镜到底:秒懂一、二维前缀和的逻辑与实现方式

首先可以构建名为dp的前缀和数组,这样比起每次都去暴力的遍历判断节省不少的时间,因为此时原生数组的下标是从0开始的,所以不能直接套用一维前缀和模板,而是先要对其进行处理,得出符合此题的动态转移方程,dp[1]所对应的是nums[0],所以dp[i]=dp[i-1]+nums[i-1]。

题目要求求判断i之前和之后是否相等,而求i之前的和只需要直接查找dp[i-1]就可以得到,查找i之后的只需要拿dp[n]-dp[i]就可以得到。

所以此题的使用公式为:dp[i-1]==dp[n]-dp[i];

代码实现

class Solution {
public:
    int pivotIndex(vector<int>& nums) 
    {
        vector<int> dp(nums.size()+1);
        int ret=0,n=nums.size();
        //构建前缀和数组
        for(int i=1;i<=nums.size();i++)
        {
            dp[i]=dp[i-1]+nums[i-1];
        }
        //使用前缀和数组
        for(int i=1;i<=nums.size();i++)
        {
            if(dp[i-1]==dp[n]-dp[i]) return i-1;
        }
        return -1;
    }
};

前缀和+后缀和思路

除了直接通过前缀和数组进行减法操作后得出i之前和之后的数来判断是否相等以外,还可以在构建前缀和数组时就直接构建出俩个数组,一个记录每个节点左边的所有元素之和就是前缀和,一个记录每个节点右边的所有元素的和,构建好后只需要一次遍历从左往右遍历时比较两棵树对应的值就能找到最左符合要求的节点。

注意这里的每个节点存的时它之前的数的和,所以当前节点存的数是不包含nums数组中相对应的该位置的数的,而且此时所构建的前后缀和数组下标是直接从0开始的而题目说最靠左或右的左或右的和都为零,所以此时需要处理一下边界,所以前缀和数组0的位置赋值为0,后缀和n-1的位置赋值为0。然后构造数组时直接从第二个元素开始构造。从而得出前缀和的公式:

dpf[i]=dp[i-1]+nums[i-1];

后缀和公式:

dpe[i]=dpe[i+1]+dpe[i+1];

然后直接遍历进行比较就可以。

代码实现

class Solution {
public:
    int pivotIndex(vector<int>& nums) 
    {
        vector<int> dpf(nums.size()),dpe(nums.size());
        dpf[0]=0;
        dpe[nums.size()-1]=0;
        for(int i=1;i<nums.size();i++)//构造前缀和数组
        {
            dpf[i]=dpf[i-1]+nums[i-1];
        }
        for(int i=nums.size()-2;i>=0;i--)//构造后缀和数组
        {
            dpe[i]=dpe[i+1]+nums[i+1];
        }
        for(int i=0;i<nums.size();i++)
        {
            if(dpf[i]==dpe[i]) return i;
        }
        return -1;
    }
};

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

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

相关文章

Figma 最新版下载:无需激活码,轻松安装!

从事设计工作&#xff0c;怎么能没有设计工具呢&#xff1f;我相信许多设计师也必须使用Figma这样的软件&#xff0c;真的可以让我们的设计工作更有效率&#xff0c;但我相信你也发现Figma属于外国软件&#xff0c;自然语言也是英语&#xff0c;直到现在没有中文版本&#xff0…

Java基础 - 6 - 面向对象(二)

Java基础 - 6 - 面向对象&#xff08;一&#xff09;-CSDN博客 二. 面向对象高级 2.1 static static叫做静态&#xff0c;可以修饰成员变量、成员方法 2.1.1 static修饰成员变量 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a;类变量、实例变量&#xff08;对象…

初始计算机组成原理

1.初始计算机组成原理 本人相关文章&#xff1a;Linux之计算机概论 声明&#xff1a;大部分图片均来自网络&#xff0c;侵删 一个完整的计算机系统包括硬件子系统和软件子系统两大部分。 组成一台计算机的物理设备的总称叫做计算机硬件子系统,是看得见摸得着的实体,是计算机工…

tomcat 单机反向代理的搭建

一 tomcat nginx 动静分离 &#xff08;一&#xff09;常见四种情况 1&#xff0c;standaione 此模式一般在测试环境 tomcat抗高并发 差 2&#xff0c;单机反向代理 nginx 做代理 和静态资源处理 把动态给tomcat AJP 是httpd和tomcat 的特殊协议 因为这同一家公司开发…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 通过这种方式&#xff0c;SpringBoot致力于在蓬勃发展的快速应用开发…

【Python】进阶学习:pandas--read_excel()函数的基本使用

【Python】进阶学习&#xff1a;pandas–read_excel()函数的基本使用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希…

C++ 模拟OJ

目录 1、1576. 替换所有的问号 2、 495. 提莫攻击 3、6. Z 字形变换 4、38. 外观数列 5、 1419. 数青蛙 1、1576. 替换所有的问号 思路&#xff1a;分情况讨论 ?zs&#xff1a;左边没有元素&#xff0c;则仅需保证替换元素与右侧不相等&#xff1b;z?s&#xff1a;左右都…

2024年【起重机械指挥】考试及起重机械指挥考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试是安全生产模拟考试一点通总题库中生成的一套起重机械指挥考试报名&#xff0c;安全生产模拟考试一点通上起重机械指挥作业手机同步练习。2024年【起重机械指挥】考试及起重机械指挥考试报名 1、【多…

行列式错题本

《1800》 1 阶数和转置 A是三阶,B是4阶,还有2这个系数 2 怎么啥也不会呀,委屈 行列式的拆分+提取系数 3

【NR 定位】3GPP NR Positioning 5G定位标准解读(四)

目录 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的网络接口 6.1.1 通用LCS控制平面架构 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 终端协议 6.2.1 LTE定位协议&#xff08;LPP&#x…

机器学习模型总结

多元线性回归&#xff08;linear regression&#xff09; 自变量&#xff1a;连续型数据&#xff0c;因变量&#xff1a;连续型数据 选自&#xff1a;周志华老师《机器学习》P53-55 思想&#xff1a;残差平方和达到最小时的关系式子即为所求&#xff0c;残差平方和&#xff1a…

考研英语语法(句子成分)

目录 1.主句的成分&#xff1a; 2.化妆后句子的成分&#xff1a; 3.句子的基本结构&#xff1a; 4.句子成分表 5.复杂句型总结 1.并列句&#xff08;是由并列连词连接两个或两个以上的句子&#xff0c;用逗号隔开&#xff09; 2.名词性从句&#xff08;名词在句中充当成…

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 &#xff08;最多只能有128个字符&#xff09;Code&#xff1a; 字符转换成ascii码ASCII码对照表 Unicode &#xff08;用于表示世界上几乎所有的文字和符号&#xff09;URL编码 &#xff08;解决服务器只能识别ASCII字符的问题&#x…

【数据结构】复杂度详解

目录 &#xff08;一&#xff09;算法的复杂度 &#xff08;二&#xff09;时间复杂度 &#xff08;1&#xff09;练笔解释&#xff1a; i&#xff0c;示例1 ii&#xff0c;示例2 iii&#xff0c;二分查找 iv&#xff0c;斐波那契 &#xff08;三&#xff09;空间复杂度…

带使能控制的锂电池充放电解决方案

一、产品概述 TP4594R 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理 SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4594R 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块…

企业指标体系建设与管理:运用MECE原则与战略地图,打造完美闭环

在数字化时代&#xff0c;数据已经成为企业的核心资产。为了更好地利用这些数据&#xff0c;企业需要建立一套科学、完整、高效的指标体系。而在这个过程中&#xff0c;MECE原则&#xff08;Mutually Exclusive, Collectively Exhaustive&#xff0c;即“相互独立&#xff0c;完…

day04-Maven-SpringBootWeb入门

文章目录 01. Maven1.1 课程安排1.2 什么是Maven1.3 Maven的作用1.4 Maven模型1.5 Maven仓库1.6 Maven安装1.6.1 下载1.6.2 安装步骤 2 IDEA集成Maven2.1 配置Maven环境2.1.1 当前工程设置2.1.2 全局设置 2.2 创建Maven项目2.3 POM配置详解2.4 Maven坐标详解2.5 导入Maven项目 …

探索Ubuntu命令行:常见问题与解决方案

一、引言 Ubuntu&#xff0c;作为一款流行的Linux发行版&#xff0c;其命令行界面&#xff08;CLI&#xff09;为用户提供了丰富的功能和灵活性。然而&#xff0c;对于新手来说&#xff0c;命令行可能会带来一些挑战。本文将探讨一些在使用Ubuntu命令行时可能遇到的问题及其解决…

#QT(DEMO)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;打印"hello wolrd" 3.记录 &#xff08;1&#xff09;创建一个新工程&#xff1a; 新建好一个工程存放文件夹&#xff08;路径不能有中文&#xff09;,然后按下图配置 &#xff08;2&#xff09;点击widgets.ui拖入以…

数学建模【多元线性回归模型】

一、多元线性回归模型简介 回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的任务就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进…