左右两边子数组的和相等
题目描述
给你一个整数数组 nums ,请计算数组的 中心下标 。
数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/tvdfij
class Solution {
public int pivotIndex(int[] nums) {
int sum = 0, total = 0;
int sym = 0;
for(int i = 0; i < nums.length; i++) {
total += nums[i];
}
for(int j = 1; j < nums.length; j++) {
sum += nums[j - 1];
if(sum == total - sum - nums[j]) {
sym = j;
return sym;
} else if(sum == total - sum) {
return sym = 0;
} else if(sum != total - sum - nums[j] && sum != total - sum) {
return sym = -1;
}
}
return sym;
}
}
我最初是这样写的,但是有的用例一直不通过,所以看了题解,官方给出的答案确实很简洁,也很巧妙(我应该多动点脑子。。。)
数组总和total,中心下标左侧和sum,右侧和total - sum - nums[i],当左右侧和相等,则有:sum = total - sum - nums[i],即2sum + nums[i] = total
官方给的题解:
class Solution {
public int pivotIndex(int[] nums) {
int sum = 0;
int total = Arrays.stream(nums).sum();
for(int i = 0; i < nums.length; i++) {
if(2 * sum + nums[i] == total) {
return i;
}
sum += nums[i];
}
return -1;
}
}
通过。