一、 题目描述
给你一个整数数组 nums ,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -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 ,二者相等。
二、 代码思路
暴力解法+前缀和即可:
所以中心点 i 左侧之和:temps[i];
中心点 i 右侧之和:temps[nums.length] - temps[i + 1];
观察是否相等即可
三、 代码题解
class Solution {
public int pivotIndex(int[] nums) {
int temps[] = new int[nums.length + 1];
//这里将temp数组扩容了一个,目的是第i个元素存储前i-1的前缀和
//原因是:我们找中心点的条件是:中心点左右数字之和相等
//所以中心点 i 左侧之和:temps[i];
//中心点 i 右侧之和:temps[nums.length] - temps[i + 1];
//针对特殊情况 i 为 nums 数组的最后一个元素,
//则 i=nums.length -1 ,此时:
//temps[nums.length] - temps[i + 1] = 0
//因此能够表示最后一个元素的右侧和为0的边界情况。
temps[0] = 0;
//先判断一下边界值
if(nums.length == 1) return 0;
for(int i = 0; i < nums.length; i++) {
temps[i + 1] = temps[i] + nums[i];
}
for(int i = 0; i < nums.length; i++){
if(temps[i] == temps[nums.length] - temps[i + 1]) return i;
}
//for循环中无符合条件的数就返回-1
return -1;
}
}
优化题解:
减少了空间上的开销:
class Solution {
public int pivotIndex(int[] nums) {
int total = Arrays.stream(nums).sum();
int sum = 0;
for (int i = 0; i < nums.length; ++i) {
if (2 * sum + nums[i] == total) {
return i;
}
sum += nums[i];
}
return -1;
}
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/tvdfij/solution/zuo-you-liang-bian-zi-shu-zu-de-he-xiang-5j4r/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。