文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目注意】
- 六【题目示例】
- 七【题目提示】
- 八【解题思路】
- 九【时间频度】
- 十【代码实现】
- 十一【提交结果】
一【题目类别】
- 前缀和
二【题目难度】
- 简单
三【题目编号】
- 724.寻找数组的中心下标
四【题目描述】
- 给你一个整数数组
nums
,请计算数组的 中心下标 。 - 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
- 如果中心下标位于数组最左端,那么左侧数之和视为
0
,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。 - 如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回
-1
。
五【题目注意】
- 本题与主站 1991 题相同:https://leetcode-cn.com/problems/find-the-middle-index-in-array/
六【题目示例】
-
示例 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 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
- − 1000 < = n u m s [ i ] < = 1000 -1000 <= nums[i] <= 1000 −1000<=nums[i]<=1000
八【解题思路】
- 利用前缀和的思想解决该问题
- 利用两个变量分别记录左右部分数字和
- 左侧数字和初始化为0
- 右侧数字和初始化为整个数组的和
- 然后使数组中每个值都会当一次“中心下标”,以计算左右侧数组之和是否相等,其中
- 左侧数字和通过加当前位置值获得
- 右侧数字和通过减当前位置值获得
- 通过对比即可得到数组的中心下标
- 最后返回结果即可
- 具体细节可以参考下面的代码
九【时间频度】
- 时间复杂度: O ( n ) O(n) O(n), n n n为传入的数组的长度
- 空间复杂度: O ( 1 ) O(1) O(1)
十【代码实现】
- Java语言版
class Solution {
public int pivotIndex(int[] nums) {
// 记录左侧数之和
int left_sum = 0;
// 记录右侧数之和
int right_sum = Arrays.stream(nums).sum();
// 数组中每个值都会当一次“中心下标”
for (int i = 0; i < nums.length; i++)
{
// 得到右侧数之和
right_sum -= nums[i];
// 如果左右侧数之和相等,则找到中心下标
if (left_sum == right_sum)
{
return i;
}
// 得到右侧数之和
left_sum += nums[i];
}
// 该数组不存在中心下标
return -1;
}
}
- Python语言版
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
# 记录左侧数之和
left_sum = 0
# 记录右侧数之和
right_sum = sum(nums)
# 数组中每个值都会当一次“中心下标”
for i in range(len(nums)):
# 得到右侧数之和
right_sum -= nums[i]
# 如果左右侧数之和相等,则找到中心下标
if left_sum == right_sum:
return i
# 得到右侧数之和
left_sum += nums[i]
# 该数组不存在中心下标
return -1
- C语言版
int pivotIndex(int* nums, int numsSize)
{
// 记录左侧数之和
int left_sum = 0;
// 记录右侧数之和
int right_sum = 0;
for (int i = 0; i < numsSize; i++)
{
right_sum += nums[i];
}
// 数组中每个值都会当一次“中心下标”
for (int i = 0; i < numsSize; i++)
{
// 得到右侧数之和
right_sum -= nums[i];
// 如果左右侧数之和相等,则找到中心下标
if (left_sum == right_sum)
{
return i;
}
// 得到右侧数之和
left_sum += nums[i];
}
// 该数组不存在中心下标
return -1;
}
十一【提交结果】
-
Java语言版
-
Python语言版
-
C语言版