前缀和——724. 寻找数组的中心下标

news2024/12/24 11:27:14

在这里插入图片描述

文章目录

    • 🍓1. 题目
    • 🫒2. 算法原理
      • 🦄解法一:暴力枚举
      • 🦄解法二:前缀和
    • 🥔3. 代码实现

🍓1. 题目

题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode)

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

🫒2. 算法原理

🦄解法一:暴力枚举

这题的意思就是找到一个所谓的“中间位置”(不包含这个位置),让其两边的和都相等,如果整个数组都找完了,没有符合的,那么久返回-1,这题定位在简单级别,直接想法就是暴力枚举。

遍历数组,每个中心下标都枚举出左边和右边的元素和,这个时间复杂度为O(N2),这里就不作示例了。
在这里插入图片描述

🦄解法二:前缀和

我们可以用前缀和的思想来优化这个暴力解法

不要笨重的记dp[i] = dp[i-1] + arr[i]模板,根据题目实际需求分析

这里要求一个下标的左边和右边的元素,我们可以采用f表示前缀和数组,g表示后缀和数组:

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

image-20231123114326738

有了前缀和与后缀和数组,我们直接判断f[i] == g[i]即可

细节问题:

  • 初始化:这里是从下标0开始的,那么f[0]就需要特殊处理一下,f[0] = 0
    同理g[n-1]也是,g[n-1] = 0
  • 填表顺序:对于f,因为要依赖f[i-1],所以填表顺序为从左向右;
    对于g,要依赖g[i+1],所以填表顺序为从右向左

这个时间复杂度为O(n)+O(n)+O(n),可理解为O(N)

🥔3. 代码实现

class Solution {
public:
    int pivotIndex(vector<int>& nums)
    {
        int n = nums.size();
        vector<int> f(n),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;
    }
};

力扣这个击败多少用户有时候是看网速的,如果算法没问题,多提交几次就行了,如果不在意,也可以忽略,没什么影响。
在这里插入图片描述

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

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

相关文章

【一文搞定】在Docker中搭建centos7远程桌面环境(Xfce、Gnome两种方式)

目录 前言一、基于GNOME构建远程桌面二、基于Xfce构建远程桌面&#xff08;轻量级&#xff09; 前言 本文提供两种安装方式&#xff0c;均自己测试过&#xff0c;最后还是选择了Xfce&#xff0c;因为它比较轻量级&#xff0c;占用资源较少。大家也可以都试试&#xff0c;比较感…

idea 26 个天花板技巧

1、 查看代码历史版本&#xff1b;2、 调整idea的虚拟内存&#xff1a;&#xff1b;3、 idea设置成eclipse的快捷键&#xff1b;4、 设置提示词忽略大小写&#xff1b;5、 关闭代码检查&#xff1b;6、 设置文档注释模板&#xff1b;7、 显示方法分隔符&#xff1b;8、 设置多行…

【大神支招】3步,打造一张BI报表

随着BI报表的高效直观、灵活分析的特点越来越被大家所熟知&#xff0c;很多BI零基础的用户可积极尝试制作BI报表&#xff0c;以达到灵活自助分析、高效智能分析的效果。那么BI报表零基础的小白们该怎么做BI报表&#xff0c;才能又快又好地做出来&#xff1f; 大神支招&#xf…

Authing 入选《 2023 年央国企信创应用与实践研究报告》优秀服务商

11 月 21 日&#xff0c;Authing 身份云作为国内唯一事件驱动云原生身份平台入选《 2023 年央国企信创应用与实践研究报告》优秀服务商&#xff0c;该报告由第一新声研究院合伙人、Gartner 前高管合伙人/副总裁李长华牵头指导&#xff0c;第一新声创始人兼 CEO 组织&#xff0c…

畅捷通T6 客户端登录提示 运行时错误 372 加载控件cfloatmenu失败

客户单win10电脑, T6版本是 V7.1 不知道操作了什么每个电脑提示 运行时错误372: 从加载控件CFloatMenu失败。您的版本可能已过期。确认您使用的控件版本是同您的应用程序一起提供的。 ******* 解决办法: 找个其他电脑复制mscomctl.ocx 到操作系统目录里面注册一下,即可. …

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

【Unity】 UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

1. 什么是PhysicsRaycaster组件&#xff1f; PhysicsRaycaster是Unity UGUI中的一个组件&#xff0c;用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上&#xff0c;并将事件传递给相应的UI元素。 2. PhysicsRaycaster的工作原理 PhysicsRaycast…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点&#xff0c;通过工频滤波、基线滤波和肌电滤波等处理&#xff0c;能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接&#xff0c;实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

Python函数式编程:让你的代码更优雅更简洁

概要 函数式编程&#xff08;Functional Programming&#xff09;是一种编程范式&#xff0c;它将计算视为函数的求值&#xff0c;并且避免使用可变状态和循环。 函数式编程强调的是函数的计算&#xff0c;而不是它的副作用。 在函数式编程中&#xff0c;函数是第一类公民&a…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见&#xff0c;经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别&#xff0c;oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多&#xff0c;这就导致数据…

springboot使用redis缓存乱码(key或者 value 乱码)一招解决

如果查看redis中的值是这样 创建一个配置类就可以解决 package com.deka.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; i…

2024年的云趋势:云计算的前景如何?

本文讨论了2024年云计算的发展趋势。 适应复杂的生态系统、提供实时功能、优先考虑安全性和确保可持续性的需求正在引领云计算之船。多样化的工作负载允许探索通用的公共云基础设施范例之外的选项。由于需要降低成本、提高灵活性和降低风险&#xff0c;混合云和多云系统越来越受…

C++中的map和set的使用

C中的map详解 关联式容器键值对树形结构的关联式容器set的使用1. set的模板参数列表2. set的构造3. set的迭代器4. set的容量5. set修改操作6. set的使用举例 map1. map的简介2. map的模板参数说明3. map的构造4. map的迭代器5. map的容量与元素访问6. map的元素修改 multimap和…

机器学习之危险品车辆目标检测

危险品的运输涉及从离开仓库到由车辆运输到目的地的风险。监控事故、车辆运动动态以及车辆通过特定区域的频率对于监督车辆运输危险品的过程至关重要。 在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数…

js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj,将数组中的内容作为对象的key转化为对象,对应的值转换为对象对应的值

1.需求场景 哈喽 大家好啊&#xff0c;今天遇到一个场景&#xff0c; js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj&#xff0c;将数组中的内容作为对象的key转化为对象&#xff0c;对应的值转换为对象对应的值 数组对象中某个属性的值&#xff0c;转…

开店必看!又有新变化?一文读懂2024亚马逊卖家入驻要求和流程

亚马逊2024年新卖家入驻正在火热进行中&#xff0c;想加入亚马逊卖家行列的小伙伴们准备好了吗&#xff1f;9月20日&#xff0c;亚马逊官方宣布2024年新卖家入驻正式开启&#xff0c;又一年招商季来临&#xff0c;东哥还了解到2024年亚马逊卖家注册要求有了一点新变化&#xff…

白银现货怎么开户,需要投入多少钱?

在白银投资市场中&#xff0c;有一种交易产品种类&#xff0c;它能够提供给人们稳定的理财环境&#xff0c;还具有辨别的交易环境。这种白银理财产品就是现货白银&#xff0c;也有一部分投资者将其称为白银现货。为了人们对这一产品具有更加清晰的认识&#xff0c;今天万洲金业…

行情分析 - - 加密货币市场大盘走势(11.23)

大饼昨日又开始了回调&#xff0c;因为FTF消息&#xff0c;而实际还是要下跌的&#xff0c;耐心等待即可。 空单策略&#xff1a;入场37300 止盈34000-33000 止损39000 以太昨日上涨也很激励&#xff0c;目前上涨打了止损&#xff0c;现在入场是好的机会&#xff0c;等待即可。…

揭开未来:塑造数字营销的尖端技术

介绍 对于企业来说&#xff0c;要想在瞬息万变的数字营销世界中取得成功&#xff0c;领先一步至关重要。技术正在以惊人的速度发展&#xff0c;开辟了新的机会&#xff0c;正在改变营销人员与消费者的互动方式。这篇文章的目的是重点介绍重新定义数字营销领域的十大创新技术。…