给你一个下标从 0 开始的二进制数组 nums
,其长度为 n
;另给你一个 正整数 k
以及一个 非负整数 maxChanges
。
Alice 在玩一个游戏,游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums
中拾起 k
个 1 。游戏开始时,Alice 可以选择数组 [0, n - 1]
范围内的任何索引 aliceIndex
站立。如果 nums[aliceIndex] == 1
,Alice 会拾起一个 1 ,并且 nums[aliceIndex]
变成0
(这 不算 作一次行动)。之后,Alice 可以执行 任意数量 的 行动(包括零次),在每次行动中 Alice 必须 恰好 执行以下动作之一:
j != aliceIndex
且满足 nums[j] == 0
,然后将 nums[j]
设置为 1
。这个动作最多可以执行 maxChanges
次。x
和 y
(|x - y| == 1
)且满足 nums[x] == 1
, nums[y] == 0
,然后交换它们的值(将 nums[y] = 1
和 nums[x] = 0
)。如果 y == aliceIndex
,在这次行动后 Alice 拾起一个 1 ,并且 nums[y]
变成 0
。返回 Alice 拾起 恰好 k
个 1 所需的 最少 行动次数。
示例 1:
输入:nums = [1,1,0,0,0,1,1,0,0,1], k = 3, maxChanges = 1
输出:3
解释:如果游戏开始时 Alice 在 aliceIndex == 1
的位置上,按照以下步骤执行每个动作,他可以利用 3
次行动拾取 3
个 1 :
nums[1]
变成了 0
。此时 nums
变为 [1,1,1,0,0,1,1,0,0,1]
。j == 2
并执行第一种类型的动作。nums
变为 [1,0,1,0,0,1,1,0,0,1]
x == 2
和 y == 1
,并执行第二种类型的动作。nums
变为 [1,1,0,0,0,1,1,0,0,1]
。由于 y == aliceIndex
,Alice 拾取了一个 1 ,nums
变为 [1,0,0,0,0,1,1,0,0,1]
。x == 0
和 y == 1
,并执行第二种类型的动作。nums
变为 [0,1,0,0,0,1,1,0,0,1]
。由于 y == aliceIndex
,Alice 拾取了一个 1 ,nums
变为 [0,0,0,0,0,1,1,0,0,1]
。请注意,Alice 也可能执行其他的 3
次行动序列达成拾取 3
个 1 。
示例 2:
输入:nums = [0,0,0,0], k = 2, maxChanges = 3
输出:4
解释:如果游戏开始时 Alice 在 aliceIndex == 0
的位置上,按照以下步骤执行每个动作,他可以利用 4
次行动拾取 2
个 1 :
j == 1
并执行第一种类型的动作。nums
变为 [0,1,0,0]
。x == 1
和 y == 0
,并执行第二种类型的动作。nums
变为 [1,0,0,0]
。由于 y == aliceIndex
,Alice 拾起了一个 1 ,nums
变为 [0,0,0,0]
。j == 1
并执行第一种类型的动作。nums
变为 [0,1,0,0]
。x == 1
和 y == 0
,并执行第二种类型的动作。nums
变为 [1,0,0,0]
。由于y == aliceIndex
,Alice 拾起了一个 1 ,nums
变为 [0,0,0,0]
。
提示:
2 <= n <= 105
0 <= nums[i] <= 1
1 <= k <= 105
0 <= maxChanges <= 105
maxChanges + sum(nums) >= k