一 🏠 题目描述
724. 寻找数组的中心下标
给你一个整数数组 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 🚀 关键信息
解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和
从题干易知,sum - nums[i] = pivotIndexLeftSum + pivotIndexRightSum =2 * pivotIndexLeftSum
提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃
2.2 🚀 思路整理
一次遍历
遍历数组,当满足 sum ==2 * pivotIndexLeftSum + nums[i] 时,返回索引
整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃
三 🏠 代码详解
3.1 🚀 代码实现
按照我们刚才的破题思路,直接代码走起来 👇👇👇👇
int pivotIndex(vector<int>& nums) { int pivotIndexLeftSum =0, len = nums.size(); //初始化左侧之和, 获取数组长度 int sum = accumulate(nums.begin(), nums.end(), 0); //计算数字总和 for (int i =0; i < len; ++i) { //遍历数组 if (sum ==2 * pivotIndexLeftSum + nums[i]) return i; //满足条件, 则返回索引 pivotIndexLeftSum += nums[i]; //否则将当前值加入左侧之和, 移动索引 } return -1; //返回 -1}
3.2 🚀 细节解析
看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃
那么我们挖一 🏠 题目描述
724. 寻找数组的中心下标
给你一个整数数组 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 🚀 关键信息
解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和
从题干易知,sum - nums[i] = pivotIndexLeftSum + pivotIndexRightSum =2 * pivotIndexLeftSum
提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃
2.2 🚀 思路整理
一次遍历
遍历数组,当满足 sum == 2 * pivotIndexLeftSum + nums[i] 时,返回索引
整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃
三 🏠 代码详解
3.1 🚀 代码实现
按照我们刚才的破题思路,直接代码走起来 👇👇👇👇
int pivotIndex(vector<int>& nums) { int pivotIndexLeftSum =0, len = nums.size(); //初始化左侧之和, 获取数组长度 int sum = accumulate(nums.begin(), nums.end(), 0); //计算数字总和 for (int i =0; i < len; ++i) { //遍历数组 if (sum ==2 * pivotIndexLeftSum + nums[i]) return i; //满足条件, 则返回索引 pivotIndexLeftSum += nums[i]; //否则将当前值加入左侧之和, 移动索引 } return -1; //返回 -1}
3.2 🚀 细节解析
看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃
那么我们挖掘上述实现的晦涩细节 😖😖😖 进行解析,直接开干,走起来 👇👇👇👇
if (sum ==2 * pivotIndexLeftSum + nums[i])
很直白的题,无特殊点,核心是左侧所有元素相加和等于右侧所有元素相加和 🐳🐳🐳
四 🏠 心路历程
为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈
博主在第一阶段提取 🚀 关键信息没有问题,在第二阶段 🚀 思路整理没有问题 (上述实现和题解博主原创)