1991. 找到数组的中间位置(前缀和)

166 阅读1分钟

每日刷题第19天 2021.1.14

找到数组的中间位置

题目

  • 给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个)。
  • 中间位置 middleIndex 是满足 nums[0] + nums[1] + ... + nums[middleIndex-1] == nums[middleIndex+1] + nums[middleIndex+2] + ... + nums[nums.length-1] 的数组下标。
  • 如果 middleIndex == 0 ,左边部分的和定义为 0 。类似的,如果 middleIndex == nums.length - 1 ,右边部分的和定义为 0 。
  • 请你返回满足上述条件 最左边 的 middleIndex ,如果不存在这样的中间位置,请你返回 -1 。

示例

  • 示例1
输入: nums = [2,3,-1,8,4]
输出: 3
解释:
下标 3 之前的数字和为:2 + 3 + -1 = 4
下标 3 之后的数字和为:4 = 4
  • 示例2
输入: nums = [1,-1,4]
输出: 2
解释:
下标 2 之前的数字和为:1 + -1 = 0
下标 2 之后的数字和为:0
  • 示例3
输入: nums = [2,5]
输出: -1
解释:
不存在符合要求的 middleIndex 。
  • 示例4
输入: nums = [1]
输出: 0
解释:
下标 0 之前的数字和为:0
下标 0 之后的数字和为:0

提示

  • 1 <= nums.length <= 100
  • -1000 <= nums[i] <= 1000

解法

  • ansL表示:需要记录的中点以左的值,ansR表示:需要记录的中点以右的值
    1. 提前将整个数组的和,赋值给ansR,以后每一次减去下标为i的值,该值就是下一轮的中点
    2. 判断中点两边的值是否相等,相等就返回下标,结束
    3. 不相等,就将当前的中点值加到ansL中
/**
* @param {number[]} nums
* @return {number}
*/

var pivotIndex = function(nums) {
  // [1, 7, 3, 6, 5, 6]
  // for循环遍历 ansL = ansR = 0;
  // 左 右
  let ansL = 0;
  let ansR = 0;
  // 单独判断左边为0的情况
  // 保存数组全部的和
  let ans = 0;
  nums.forEach(ele => ans += ele);
  ansR = ans;
  // console.log('ans',ans);
  for (let i = 0; i < nums.length; i++) {
    // 减法的含义:让出当前作为中间点的值
    ansR -= nums[i];
    if (ansL == ansR) {
      // 如果等于,就直接输出下标即可
      return i;
    }
    // 不等于,就继续执行
    ansL += nums[i];
  }
return -1;
};

附录

  • 思想:计算过的结果,不要丢弃,再此基础上进行加减即可。