每日刷题第19天 2021.1.14
找到数组的中间位置
- leetcode原题链接:leetcode-cn.com/problems/fi…
- 难度:简单
- 方法:数组、前缀和
题目
- 给你一个下标从 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表示:需要记录的中点以右的值
- 提前将整个数组的和,赋值给ansR,以后每一次减去下标为i的值,该值就是下一轮的中点
- 判断中点两边的值是否相等,相等就返回下标,结束
- 不相等,就将当前的中点值加到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;
};
附录
- 思想:计算过的结果,不要丢弃,再此基础上进行加减即可。