寻找数组的中心索引
一 题目
给你一个整数数组 nums ,请计算数组的中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
二 解法
思路:遍历数组,计算index的左右两侧的sum值,比较,若相等,index就为中心索引。因为题目要求如果数组有多个中心下标,应该返回最靠近左边的那一个,所以从左到右开始遍历,若符合条件,就直接返回。
class Solution {
public int pivotIndex(int[] nums) {
int result = -1;
int index = nums.length-1;
if(getSum(nums,1,index)==0){
result = 0;
}else{
for(int i=1;i<index;i++){
if(getSum(nums,0,i-1)==getSum(nums,i+1,index)){
result=i;
break;
}
}
if(result == -1){
if(getSum(nums,0,index-1)==0){
result=index;
}
}
}
return result;
}
public int getSum(int[] nums, int low, int high){
int sum = 0;
while(low<=high){
sum+=nums[low];
low++;
}
return sum;
}
}
三 优化
使用前缀和的方法来求解。
思路:如果index为数组的中心索引,那么index之前的数字之和sum1等于index之后的数字之和sum2,则:
数组总和=sum1+sum2+nums[index],
即数组总和=sum1*2+nums[index]。
class Solution {
public int pivotIndex(int[] nums) {
int result = -1;
int sum = 0;
for(int i =0; i< nums.length;i++){
sum+=nums[i];
}
int preSum = 0;
for(int i =0; i< nums.length;i++){
if(sum==nums[i]+preSum*2){
result=i;
break;
}
preSum +=nums[i];
}
return result;
}
}
t