剑指 Offer II 012. 左右两边子数组的和相等

embedded/2025/2/1 15:40:07/

comments: true
edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20012.%20%E5%B7%A6%E5%8F%B3%E4%B8%A4%E8%BE%B9%E5%AD%90%E6%95%B0%E7%BB%84%E7%9A%84%E5%92%8C%E7%9B%B8%E7%AD%89/README.md

剑指 Offer II 012. 左右两边子数组的和相等

题目描述

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

 

注意:本题与主站 724 题相同: https://leetcode.cn/problems/find-pivot-index/

解法

方法一:前缀和

我们定义变量 l e f t left left 表示数组 n u m s nums nums 中下标 i i i 左侧元素之和,变量 r i g h t right right 表示数组 n u m s nums nums 中下标 i i i 右侧元素之和。初始时 l e f t = 0 left = 0 left=0, r i g h t = ∑ i = 0 n − 1 n u m s [ i ] right = \sum_{i = 0}^{n - 1} nums[i] right=i=0n1nums[i]

遍历数组 n u m s nums nums,对于当前遍历到的数字 x x x,我们更新 r i g h t = r i g h t − x right = right - x right=rightx,此时如果 l e f t = r i g h t left=right left=right,说明当前下标 i i i 就是中间位置,直接返回即可。否则,我们更新 l e f t = l e f t + x left = left + x left=left+x,继续遍历下一个数字。

遍历结束,如果没有找到中间位置,返回 − 1 -1 1

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)。其中 n n n 为数组 n u m s nums nums 的长度。

相似题目:

  • 1991. 找到数组的中间位置
  • 2574. 左右元素和的差值
Python3
class Solution:def pivotIndex(self, nums: List[int]) -> int:left, right = 0, sum(nums)for i, x in enumerate(nums):right -= x #含去掉当前元素if left == right:return ileft += xreturn -1
Java
class Solution {public int pivotIndex(int[] nums) {int left = 0, right = 0;for (int x : nums) {right += x;}int n = nums.length;for (int i = 0; i < n; ++i) {right -= nums[i];if (left == right) {return i;}left += nums[i];}return -1;}
}
C++
class Solution {
public:int pivotIndex(vector<int>& nums) {int left = 0;int right = accumulate(nums.begin(), nums.end(), 0);int n = nums.size();for (int i = 0; i < n; ++i) {right -= nums[i];if (left == right) {return i;}left += nums[i];}return -1;}
};
Go
func pivotIndex(nums []int) int {left, right := 0, 0for _, x := range nums {right += x}for i, x := range nums {right -= xif left == right {return i}left += x}return -1
}
TypeScript
function pivotIndex(nums: number[]): number {let left = 0;let right = nums.reduce((a, b) => a + b, 0);const n = nums.length;for (let i = 0; i < n; ++i) {right -= nums[i];if (left === right) {return i;}left += nums[i];}return -1;
}
PHP
class Solution {/*** @param Integer[] $nums* @return Integer*/function pivotIndex($nums) {$left = 0;$right = array_sum($nums);for ($i = 0; $i < count($nums); $i++) {$right -= $nums[$i];if ($left == $right) {return $i;}$left += $nums[$i];}return -1;}
}
C
int pivotIndex(int* nums, int numsSize) {int left, right;left = 0;right = 0;for (int i = 0; i < numsSize; i++) {right += nums[i];}for (int i = 0; i < numsSize; i++) {right -= nums[i];if (right == left)return i;left += nums[i];}return -1;
}
Swift
class Solution {func pivotIndex(_ nums: [Int]) -> Int {var leftSum = 0var rightSum = nums.reduce(0, +)for i in 0..<nums.count {rightSum -= nums[i]if leftSum == rightSum {return i}leftSum += nums[i]}return -1}
}

http://www.ppmy.cn/embedded/158660.html

相关文章

nosql mysql的区别

NoSQL 和 MySQL 是两种不同类型的数据库管理系统&#xff0c;它们在设计理念、数据模型、可扩展性和应用场景等方面有着本质的区别。 NoSQL 数据库 特点: 灵活的数据模型: NoSQL 数据库通常没有固定的表结构&#xff0c;可以很容易地存储不同结构的文档或键值对。水平扩展: …

Day30-【AI思考】-错题分类进阶体系——12维错误定位模型

文章目录 错题分类进阶体系——12维错误定位模型**一、认知层错误&#xff08;根源性缺陷&#xff09;****二、操作层错误&#xff08;执行过程偏差&#xff09;****三、心理层错误&#xff08;元认知障碍&#xff09;****四、进阶错误&#xff08;专业级陷阱&#xff09;** 错…

仿真设计|基于51单片机的无线投票系统仿真

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;投票系统分为发送端和接收端。 &#xff08;2&#xff09;发送端通过按…

cmd命令行无法进入D:盘怎么办

我找到了一个方法就是 增加一个/d cd /d d: 如下图,我不仅可以进入d盘符下&#xff0c;还可以访问盘符下的文件夹

读书笔记-《Redis设计与实现》(一)数据结构与对象(下)

各位朋友新年快乐~ 今天我们来继续学习 Redis 。 01 整数集合 当集合仅包含整数值&#xff0c;并且元素数量不多时&#xff0c;Redis 就会采用整数集合来作为集合键的底层实现。 typedef struct intset {// 编码方式uint32_t encoding;// 元素数量uint32_t length;// 数组in…

元旦和春节取名的历史变迁

在中国漫长的历史长河中的春节&#xff0c;真要追溯起来也只有一百多年历史——是从晚清时期才逐渐出现在国人的生活里的&#xff0c;而且那时不叫“春节”而叫“元旦”。只不过随着历史的发展过程&#xff0c;“过年”这个名词也一直在演变&#xff0c;直至1949年最终才定下来…

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…

使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1

作者&#xff1a;来自 Elastic Dave Erickson 及 Jakob Reiter 每个人都在谈论 DeepSeek R1&#xff0c;这是中国对冲基金 High-Flyer 的新大型语言模型。现在他们推出了一款功能强大、具有开放权重的思想链推理 LLM&#xff0c;这则新闻充满了对行业意味着什么的猜测。对于那些…