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

在这里插入图片描述

文章目录

    • 🍓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.hqwc.cn/news/211320.html

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

相关文章

排查光模块故障原因,少不了这2条命令!

光模块故障定位常用命令 根据光模块的告警信息查找故障原因&#xff1a; display interface transceiver查看光模块光功率是否正常 display interface transceiver verbose根据光模块的告警信息查找故障原因 执行命令display interface transceiver查看“Alarm information”…

传统制造业如何有效实现数字化?企业数字化转型可以借助哪些工具?

2020年&#xff0c;制造业数字化转型行业的价值为2630亿美元。然而&#xff0c;到2026年&#xff0c;这一数字预计将达到惊人的7670亿美元。随着新技术的出现&#xff0c;工业4.0时代已经开始。这是由软件开发和自动化带来的对数字化的日益依赖所决定的&#xff0c;这使得制造过…

python获取json所有节点和子节点

使用python获取json的所有父结点和子节点 并使用父节点加下划线命名子节点 先展示一段json代码 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

深入剖析预约上门服务系统源码:构建高效服务的代码之旅

在本文中&#xff0c;我们将深入研究预约上门服务系统的源码&#xff0c;透过代码的层层剖析&#xff0c;揭示系统背后的技术奥秘。我们将关注系统的核心功能&#xff0c;并通过代码示例演示其实现过程&#xff0c;为读者提供一个深度技术解读的体验。 1. 技术栈选择&#xf…

plantUML学习与实战

背景 在日常工作或者生活中&#xff0c;使用交互图来描述想法&#xff0c;往往相对于文字来说&#xff0c;可读性更高&#xff0c;同时一定程度上可以提高沟通效率&#xff0c;但是苦于&#xff0c;不想对一堆控件拖拖拉拉&#xff0c;本人就是一个很讨厌画图&#xff0c;但是…

java学习part09类的构造器

1. 2.默认构造器 如果没有显式定义任何构造器&#xff0c;系统会默认加一个默认构造器。 如果定义了&#xff0c;则不会有默认构造器。 默认构造器的权限和类的权限一样&#xff0c;类是public构造器就是public&#xff0c;类是缺省默认构造器就是缺省 反编译之后添加的构造…

Astute Graphics 2023(ai创意插件合集)

Astute Graphics 2023是一家专注于图形编辑软件的公司&#xff0c;以制作高质量、功能强大的图像编辑工具而闻名。如Poser Pro、Poser 3D、Smart Shapes、Astute Sketch Pro等。 Astute Graphics的软件具有以下特点&#xff1a; 强大的图像编辑功能&#xff1a;Astute Graphi…

动态规划求二维网格中从左上角到右下角的最短路径( 每次只能向下、向右、向右下走 ) java 实现

dp[i][j] 表示在以点(0,0)作为左上角&#xff0c;点(i,i) 作为右下角的二维网格中 左上角到右下角的最短路径&#xff0c; 动态转移方程为&#xff1a;dp[i][j] min{ dp[i][j-1],dp[i-1][j],dp[i-1][j-1] }.distance weight[i][j] ImageUtils.java&#xff1a; import java.a…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列&#xff0c;例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息&#xff0c;以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

蓝桥杯算法双周赛心得——迷宫逃脱(dp)

大家好&#xff0c;我是晴天学长&#xff0c;dp版的来啦&#xff0c;可以是受益匪浅啊&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宫逃脱 迷官逃脱[算法赛] 问题描述 在数学王国中&#xff0c;存…

【办公常识_1】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

STM32——外部中断

文章目录 0.中断关系映射1.使能 IO 口时钟&#xff0c;初始化 IO 口为输入2.设置 IO 口模式&#xff0c;触发条件&#xff0c;开启 SYSCFG 时钟&#xff0c;设置 IO 口与中断线的映射关系。3.配置NVIC优先级管理&#xff0c;并使能中断4.编写中断服务函数。5.编写中断处理回调函…