给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。
我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
示例 1:
输入:
nums = [1, 7, 3, 6, 5, 6]
输出: 3
解释:
索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。
示例 2:
输入:
nums = [1, 2, 3]
输出: -1
解释:
数组中不存在满足此条件的中心索引。
说明:
nums 的长度范围为 [0, 10000]。
任何一个 nums[i] 将会是一个范围在 [-1000, 1000]的整数。
妈耶,这道题其实没什么难度的,一开始我以为数组的数字全是正数,按照那个思路来,那么设置一个前后指针就完事了,但是一提交发现有负数,那么肯定不能使用那个方法了
最后得出的是
代码,由于我没有判断第0个和最后一个,这是在测试中得出的,如果是第零个,那么只要判断除了第0个之外其余元素之和是否为0即可,同理,如果是最后一个也是如此,效率不是很高,
class Solution {
public int pivotIndex(int[] nums) {
if(nums.length == 0){
return -1;
}
int index = 0;
int sumA = nums[0];
int sumB = 0;
int end = nums.length - 1;
for (int i : nums) {
sumB += i;
}
int s= sumB;
if(sumB - nums[0] == 0 ){
return 0;
}
//初始化的是1是否是的
sumB = sumB - nums[0] - nums[1];
for (int i = 1; i < nums.length -1; i++) {
if(sumA == sumB){
return index + 1;
}else {
sumA +=nums[index + 1];
index ++;
sumB -=nums[index + 1];
}
}
if(s - nums[nums.length-1] == 0){
return nums.length-1;
}
return -1;
}
}
适合全是正数的数组,使用的是双向指针
代码
// 如果只出现的是正数可以用下面这个,但是如果出现的是负数那么可能要换种方法
if(nums.length == 0){
return -1;
}
int start = 0;
int end = nums.length - 1;
int presum = nums[start];
int endsum = nums[end];
while (start < end) {
if(presum > endsum){
end--;
endsum +=nums[end];
}else if(presum < endsum){
start ++;
presum +=nums[start];
}else {
if(start + 1 == end - 1){
return start +1;
}else {
end--;
start++;
}
}
}
return -1;
排名靠前的代码,思路差不多
class Solution {
public int pivotIndex(int[] nums) {
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
int tmpSum = 0;
for (int i = 0; i < nums.length; i++) {
if (tmpSum == sum - tmpSum - nums[i]) {
return i;
}
tmpSum += nums[i];
}
return -1;
}
}