这是一题比较典型的前缀和题目
刚开始拿到题目的时候想的比较耿直,直接求数组和,然后再遍历数组,如果累加到是sum的一半的时候就return,但是不能ac,这里会存在一些边界的问题,最后用前缀和来解决
先来看看耿直的错误代码
var pivotIndex = function (nums) {
let sum = 0
nums.forEach(el => {
sum += el
})
let leftSum = 0
for (let i = 0; i < nums.length; ++i) {
leftSum += nums[i]
if (i + 1 < nums.length) {
if (leftSum === (sum - nums[i + 1]) / 2) {
return i + 1
} else if (leftSum < (sum - nums[i + 1]) / 2) {
continue
} else {
return -1
}
}
}
};
[2, -1, -1] // 不能通过
// 其次内层if的判断也存在问题
下面还是错误代码
var pivotIndex = function (nums) {
let len = nums.length
let preSum = new Array(len).fill(0)
preSum[0] = nums[0]
for (let i = 1; i < len; ++i) {
preSum[i] = nums[i] + preSum[i - 1]
}
let left = 0, right = 0
for (let i = 0; i < len; ++i) {
left = preSum[i] - nums[i]
right = preSum[len - 1] - preSum[i]
if (left === right) {
return i
} else if (left > right) { // 这里的这个判断存在问题
return -1
}
}
};
[-1, -1, -1, -1, -1, 0] // 不能通过
然后就是第一次提交的代码中的if判断问题,存在问题
如果全是负数,那么判断 left > right 就有问题了,删除这个判断就好了,然后到代码最后加上 return -1
最后这里就是最终的正确代码了
var pivotIndex = function (nums) {
let len = nums.length
let preSum = new Array(len).fill(0)
preSum[0] = nums[0]
for (let i = 1; i < len; ++i) {
preSum[i] = nums[i] + preSum[i - 1]
}
let left = 0, right = 0
for (let i = 0; i < len; ++i) {
left = preSum[i] - nums[i]
right = preSum[len - 1] - preSum[i]
if (left === right) {
return i
}
}
return -1
};
下面是gpt给出的答案,跟我刚开始的耿直思路一样,只是我没有把这个耿直思路写好😂
var pivotIndex = function(nums) {
let totalSum = nums.reduce((a, b) => a + b, 0); // 总和
let leftSum = 0; // 左侧和
for (let i = 0; i < nums.length; ++i) {
// 右侧和为总和减去当前索引的左侧和和当前元素
let rightSum = totalSum - leftSum - nums[i];
if (leftSum === rightSum) {
return i;
}
leftSum += nums[i]; // 更新左侧和
}
return -1; // 没有找到 pivot 索引
};