
2025-06-06:使数组元素等于零。用go语言,给定一个整数数组 nums。
起始时,你需要选择一个索引 curr,要求 nums[curr] = 0,并选择一个移动方向(向左或向右)。
接下来按照以下步骤进行:
当整个过程结束时,如果数组 nums 中所有元素均为 0,则说明该起始位置和方向是有效的。
请返回所有可能的有效起始位置和方向的组合数量。
1 <= nums.length <= 100。
0 <= nums[i] <= 100。
至少存在一个元素 i 满足 nums[i] == 0 。
输入:nums = [1,0,2,0,3]。
输出:2。
解释:
可能的有效选择方案如下:
选择 curr = 3 并向左移动。
[1,0,2,0,3] -> [1,0,2,0,3] -> [1,0,1,0,3] -> [1,0,1,0,3] -> [1,0,1,0,2] -> [1,0,1,0,2] -> [1,0,0,0,2] -> [1,0,0,0,2] -> [1,0,0,0,1] -> [1,0,0,0,1] -> [1,0,0,0,1] -> [1,0,0,0,1] -> [0,0,0,0,1] -> [0,0,0,0,1] -> [0,0,0,0,1] -> [0,0,0,0,1] -> [0,0,0,0,0].
选择 curr = 3 并向右移动。
[1,0,2,0,3] -> [1,0,2,0,3] -> [1,0,2,0,2] -> [1,0,2,0,2] -> [1,0,1,0,2] -> [1,0,1,0,2] -> [1,0,1,0,1] -> [1,0,1,0,1] -> [1,0,0,0,1] -> [1,0,0,0,1] -> [1,0,0,0,0] -> [1,0,0,0,0] -> [1,0,0,0,0] -> [1,0,0,0,0] -> [0,0,0,0,0].
题目来自力扣3354。
nums[i] == 0 的索引 i,这些是可能的起始位置 curr。curr,尝试两个方向(左、右)。对于每个 (curr, direction) 组合:
nums 进行操作。curr 越界,结束循环。nums[curr] == 0,按当前方向移动一步。nums[curr] > 0,将其减 1,切换方向,然后按新方向移动一步。curr 越界,检查数组中是否所有元素均为 0。(curr, direction) 组合有效。(curr, direction) 组合进行模拟,统计有效的组合数量。(curr, direction) 组合需要遍历整个数组多次(每次移动可能减少一个非零元素)。n,最大值为 m,则时间复杂度为 O(n * m * n) = O(n² * m)。O(n)(每次模拟时复制数组)。O(n)。package main
import (
"fmt"
)
func countValidSelections(nums []int) (ans int) {
total := 0
for _, x := range nums {
total += x
}
pre := 0
for _, x := range nums {
if x > 0 {
pre += x
} elseif pre*2 == total {
ans += 2
} elseif abs(pre*2-total) == 1 {
ans++
}
}
return ans
}
func abs(x int)int {
if x < 0 {
return -x
}
return x
}
func main() {
nums := []int{1, 0, 2, 0, 3}
fmt.Println(countValidSelections(nums))
}

# -*-coding:utf-8-*-
defcount_valid_selections(nums):
ans = 0
total = sum(nums)
pre = 0
for x in nums:
if x > 0:
pre += x
elif pre * 2 == total:
ans += 2
elifabs(pre * 2 - total) == 1:
ans += 1
return ans
if __name__ == '__main__':
nums = [1, 0, 2, 0, 3]
print(count_valid_selections(nums))