3354. Make Array Elements Equal to Zero

Leetcode link

题目简介

/**
 * @param {number[]} nums
 * @return {number}
 */

题目给我们一个数字数组 nums,并且要求我们做一系列的操作

  1. 我们在 nums 中选择一个值为 0 的元素下标,然后选择一个方向(右移下标或者左移下标)
  2. 如果该下标移动超出数组边界,则该操作结束
  3. 如果移动过程中遇到 nums[i] === 0,则继续同方向移动
  4. 如果移动过程遇到 nums[i] > 0,则将该元素减一反方向移动

我们最后的目标是找到合适的 [下标, 方向] 组合使得整个 nums 元素在操作后均为 0

题目要求我们判断当前 nums 数组中有多少个合适的 [下标, 方向] 组合

解题思路

根据题目我们不难看出想要使数组为 0 的关键在于我们选中的下标左右两边元素和的关系

有两种可能:

  1. 选中下标左右的元素之和相等有两个可能的组合(因为此时一开始往左或者往右都可以)
  2. 选中下标左右元素之和差一:只有一个可能的组合(因为此时一开始只能往比较大的那边走)

Javascript

/**
 * @param {number[]} nums
 * @return {number}
 */
var countValidSelections = function (nums) {
    let res = 0

    const sum = nums.reduce((acc, cur) => acc + cur, 0)
    let left = 0
    let right = sum

    for (let i = 0; i < nums.length; i++) {
        if (nums[i] === 0) {
            if (left === right) {
                res += 2
            } else if (Math.abs(left - right) === 1) {
                res++
            }
        } else {
            left += nums[i]
            right -= nums[i]
        }
    }

    return res
};

results matching ""

    No results matching ""