给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。
我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-pivot-index
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的代码
var pivotIndex = function(nums) {
var sum=nums[0];
for(var i =0;i<nums.length-2;i++){
for(var j =i ;j>0;j--){
sum = sum + nums[j]
}
if(sum-nums[i+2] == 0&&i==nums.length-3){
return i+1
}else if(sum-nums[i+2]<=0){
sum =0;
continue;
} else{
var sum1 = 0;
for(var t =i+1 ;t<nums.length;t++){
sum1 = sum1 + nums[t]
}
if(sum==sum1){
return i+1
}else{
continue;
}
}
}
return -1;
};
PS:简直是……一言难尽。每次都得计算右边的和。我的思路是拿左边的和与中心索引右边那个元素比,如果比右边那个元素小了,就不需要计算右边了直接进行下次循环,如果不是,就直接左右相加,看是否相等。
奥对了,我这垃圾代码都通不过测试……还不如直接暴力法🐶
这种就是顺序思维。其实应该反过来想,看了优秀的代码后才知道,只需要计算总和以及不断计算左边的元素和然后作对比就好。
他人代码
var pivotIndex = function(nums) {
let sum = 0;
nums.forEach(num => sum += num);
let leftSum = 0;
for(i = 0; i < nums.length; i++){
if((sum - nums[i]) - leftSum == leftSum){
return i;
}else{
leftSum += nums[i];
}
}
return -1;
};
作者:lvshanke
链接:https://leetcode-cn.com/problems/find-pivot-index/solution/dan-ke-xi-lie-yong-shi-9375nei-cun-10000-by-lvshan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
PS:或者可以总和减去索引对应值=2*左边元素和。这个题的误导在于,如果中心索引是0,默认左边没有元素的时候和为0处理。