给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
考率到时间的问题,此题需要先提前计算出中心下标左右两边的总和。先置sum_left为0,sum_right 为从数组下标1开始的所有数的和。如果sum_right等于0了,说明中心下标就是0,那么直接返回0即可。如果不等于0,需要从下标1开始遍历。
假设遍历到i位置,此时左右两边数之和的公式应为:
那么可以用一个for循环来实现,代码如下:
int pivotIndex(int* nums, int numsSize){
int i;
int sum_left = 0, sum_right = 0; //提前存储左右两边的数之和
for(i = numsSize-1; i > 0; i--)
sum_right += nums[i];
if(sum_right == 0) return 0;
for(i = 1; i <numsSize; i++)
{
sum_left += nums[i-1]; //中心下标左边数的和不断增加
sum_right -= nums[i]; //中心下标右边数的和不断减少
if(sum_left == sum_right)
return i;
}
return -1;
}
很容易看出来算法复杂度为O(n)。
然而后来看了其他博主发现直接利用相等关系中的二倍特点就行了。