【leetcode】724.寻找数组的中心下标

31 阅读2分钟

leetcode-724.png

这是一题比较典型的前缀和题目

刚开始拿到题目的时候想的比较耿直,直接求数组和,然后再遍历数组,如果累加到是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 索引
};