Class Solution
-
- All Implemented Interfaces:
public final class Solution
3086 - Minimum Moves to Pick K Ones.
Hard
You are given a binary array
nums
of lengthn
, a positive integerk
and a non-negative integermaxChanges
.Alice plays a game, where the goal is for Alice to pick up
k
ones fromnums
using the minimum number of moves. When the game starts, Alice picks up any indexaliceIndex
in the range[0, n - 1]
and stands there. Ifnums[aliceIndex] == 1
, Alice picks up the one andnums[aliceIndex]
becomes0
(this does not count as a move). After this, Alice can make any number of moves ( including zero ) where in each move Alice must perform exactly one of the following actions:Select any index
j != aliceIndex
such thatnums[j] == 0
and setnums[j] = 1
. This action can be performed at mostmaxChanges
times.Select any two adjacent indices
x
andy
(|x - y| == 1
) such thatnums[x] == 1
,nums[y] == 0
, then swap their values (setnums[y] = 1
andnums[x] = 0
). Ify == aliceIndex
, Alice picks up the one after this move andnums[y]
becomes0
.
Return the minimum number of moves required by Alice to pick exactly
k
ones.Example 1:
Input: nums = 1,1,0,0,0,1,1,0,0,1, k = 3, maxChanges = 1
Output: 3
Explanation: Alice can pick up
3
ones in3
moves, if Alice performs the following actions in each move when standing ataliceIndex == 1
:At the start of the game Alice picks up the one and
nums[1]
becomes0
.nums
becomes <code>1, **<ins>1</ins>** ,1,0,0,1,1,0,0,1</code>.Select
j == 2
and perform an action of the first type.nums
becomes <code>1, **<ins>0</ins>** ,1,0,0,1,1,0,0,1</code>Select
x == 2
andy == 1
, and perform an action of the second type.nums
becomes <code>1, **<ins>1</ins>** ,0,0,0,1,1,0,0,1</code>. Asy == aliceIndex
, Alice picks up the one andnums
becomes <code>1, **<ins>0</ins>** ,0,0,0,1,1,0,0,1</code>.Select
x == 0
andy == 1
, and perform an action of the second type.nums
becomes <code>0, **<ins>1</ins>** ,0,0,0,1,1,0,0,1</code>. Asy == aliceIndex
, Alice picks up the one andnums
becomes <code>0, **<ins>0</ins>** ,0,0,0,1,1,0,0,1</code>.
Note that it may be possible for Alice to pick up
3
ones using some other sequence of3
moves.Example 2:
Input: nums = 0,0,0,0, k = 2, maxChanges = 3
Output: 4
Explanation: Alice can pick up
2
ones in4
moves, if Alice performs the following actions in each move when standing ataliceIndex == 0
:Select
j == 1
and perform an action of the first type.nums
becomes <code>**<ins>0</ins>** ,1,0,0</code>.Select
x == 1
andy == 0
, and perform an action of the second type.nums
becomes <code>**<ins>1</ins>** ,0,0,0</code>. Asy == aliceIndex
, Alice picks up the one andnums
becomes <code>**<ins>0</ins>** ,0,0,0</code>.Select
j == 1
again and perform an action of the first type.nums
becomes <code>**<ins>0</ins>** ,1,0,0</code>.Select
x == 1
andy == 0
again, and perform an action of the second type.nums
becomes <code>**<ins>1</ins>** ,0,0,0</code>. Asy == aliceIndex
, Alice picks up the one andnums
becomes <code>**<ins>0</ins>** ,0,0,0</code>.
Constraints:
<code>2 <= n <= 10<sup>5</sup></code>
0 <= nums[i] <= 1
<code>1 <= k <= 10<sup>5</sup></code>
<code>0 <= maxChanges <= 10<sup>5</sup></code>
maxChanges + sum(nums) >= k