3354. Make Array Elements Equal to Zero
题目简介
/**
* @param {number[]} nums
* @return {number}
*/
题目给我们一个数字数组 nums,并且要求我们做一系列的操作:
- 我们在 nums 中选择一个值为 0 的元素下标,然后选择一个方向(右移下标或者左移下标)
- 如果该下标移动超出数组边界,则该操作结束
- 如果移动过程中遇到
nums[i] === 0,则继续同方向移动 - 如果移动过程遇到
nums[i] > 0,则将该元素减一并反方向移动
我们最后的目标是找到合适的 [下标, 方向] 组合使得整个 nums 元素在操作后均为 0
题目要求我们判断当前 nums 数组中有多少个合适的 [下标, 方向] 组合
解题思路
根据题目我们不难看出想要使数组为 0 的关键在于我们选中的下标左右两边元素和的关系
有两种可能:
- 选中下标左右的元素之和相等:有两个可能的组合(因为此时一开始往左或者往右都可以)
- 选中下标左右元素之和差一:只有一个可能的组合(因为此时一开始只能往比较大的那边走)
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
};