Minimum Moves to Pick K Ones - Solution & Explanation
Problem Statement
You are given a binary array nums of length n, a positive integer k and a non-negative integer maxChanges.
Alice plays a game, where the goal is for Alice to pick up k ones from nums using the minimum number of moves. When the game starts, Alice picks up any index aliceIndex in the range [0, n - 1] and stands there. If nums[aliceIndex] == 1 , Alice picks up the one and nums[aliceIndex] becomes 0(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 != aliceIndexsuch thatnums[j] == 0and setnums[j] = 1. This action can be performed at mostmaxChangestimes. - Select any two adjacent indices
xandy(|x - y| == 1) such thatnums[x] == 1,nums[y] == 0, then swap their values (setnums[y] = 1andnums[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 in 3 moves, if Alice performs the following actions in each move when standing at aliceIndex == 1:
- At the start of the game Alice picks up the one and
nums[1]becomes0.numsbecomes[1,0,0,0,0,1,1,0,0,1]. - Select
j == 2and perform an action of the first type.numsbecomes[1,0,1,0,0,1,1,0,0,1] - Select
x == 2andy == 1, and perform an action of the second type.numsbecomes[1,1,0,0,0,1,1,0,0,1]. Asy == aliceIndex, Alice picks up the one andnumsbecomes[1,0,0,0,0,1,1,0,0,1]. - Select
x == 0andy == 1, and perform an action of the second type.numsbecomes[0,1,0,0,0,1,1,0,0,1]. Asy == aliceIndex, Alice picks up the one andnumsbecomes[0,0,0,0,0,1,1,0,0,1].
Note that it may be possible for Alice to pick up 3 ones using some other sequence of 3 moves.
Example 2:
Input: nums = [0,0,0,0], k = 2, maxChanges = 3
Output: 4
Explanation: Alice can pick up 2 ones in 4 moves, if Alice performs the following actions in each move when standing at aliceIndex == 0:
- Select
j == 1and perform an action of the first type.numsbecomes[0,1,0,0]. - Select
x == 1andy == 0, and perform an action of the second type.numsbecomes[1,0,0,0]. Asy == aliceIndex, Alice picks up the one andnumsbecomes[0,0,0,0]. - Select
j == 1again and perform an action of the first type.numsbecomes[0,1,0,0]. - Select
x == 1andy == 0again, and perform an action of the second type.numsbecomes[1,0,0,0]. Asy == aliceIndex, Alice picks up the one andnumsbecomes[0,0,0,0].
Constraints:
2 <= n <= 1050 <= nums[i] <= 11 <= k <= 1050 <= maxChanges <= 105maxChanges + sum(nums) >= k
Approach Overview
Problem Overview: You are given a binary array and must determine the minimum number of moves required to pick exactly k ones. A move typically represents shifting positions so the chosen ones can be grouped efficiently. The challenge is minimizing total movement while selecting the best k ones from the array.
Approach 1: Sliding Window with Prefix Sums (O(n) time, O(n) space)
The optimal strategy focuses only on indices containing 1. First collect the positions of all ones. Then use a sliding window of size k over these positions to evaluate every possible group of k ones. The key insight: the minimum movement cost occurs when all ones move toward the median index in the window. To compute movement quickly, maintain a prefix sum array of the positions so the cost of moving the left and right halves toward the median can be calculated in constant time. As the window slides, update the cost using prefix sums instead of recomputing distances. This reduces the overall complexity to linear time.
Approach 2: Dynamic Programming (O(n * k) time, O(n * k) space)
A dynamic programming formulation considers the decision of selecting ones progressively from left to right. Define a DP state where dp[i][j] represents the minimum cost to pick j ones using the first i elements. When encountering a 1, either include it in the selected group or skip it. Transition costs account for how far the current one must move relative to previously chosen ones. Although this approach models the process clearly, it requires maintaining a large state table and recalculating movement costs frequently. Time complexity grows to O(n * k), making it slower for large inputs.
The sliding window technique works because movement cost is minimized around the median position. Using prefix sums allows constant‑time distance calculations for each candidate window. This combination of array traversal, window maintenance, and median-based distance minimization avoids expensive recomputation.
Recommended for interviews: The sliding window + prefix sum solution is the expected approach. Interviewers want to see that you reduce the problem to positions of ones, recognize the median property, and compute distances efficiently. A DP formulation shows reasoning about state transitions, but the optimal sliding window solution demonstrates stronger algorithmic insight and performance awareness.
Approach 1: Sliding Window Approach
We can use a sliding window approach to find the minimum number of moves to make k consecutive elements of the array equal to 1. This technique efficiently checks subarrays of length k.
This implementation uses a sliding window to keep track of zero counts within the window of size at least k. It moves both the left and right edges to ensure we are within allowable changes.
Complexity
Time Complexity: O(n), as each element is processed at most twice.
Space Complexity: O(1), with only a few integers for tracking being used.
Approach 2: Dynamic Programming Approach
Here, dynamic programming techniques can be applied to solve the problem by saving state transformations and outcomes efficiently to determine minimum move counts required iteratively.
By storing already computed results of possible future zero flips and minimal configurations, DP can aid in recalculation avoidance.
Complexity
Time Complexity: O(n^2) if implemented naively
Space Complexity: O(n^(1 to 2) depending on the states stored)
Approach 3: Greedy + Prefix Sum + Binary Search
We consider enumerating Alice's standing position i. For each i, we follow the strategy below:
- First, if the number at position
iis1, we can directly pick up a1without needing any moves. - Then, we pick up the number
1from both sides of positioni, which is action2, i.e., move the1from positioni-1to positioni, then pick it up; move the1from positioni+1to positioni, then pick it up. Each pick up of a1requires1move. - Next, we maximize the conversion of
0s at positionsi-1ori+1to1s using action1, then move them to positioniusing action2to pick them up. This continues until the number of1s picked up reacheskor the number of times action1is used reachesmaxChanges. Assuming the number of times action1is used isc, then a total of2cmoves are needed. - After utilizing action
1, if the number of1s picked up has not reachedk, we need to continue considering moving1s to positionifrom the intervals[1,..i-2]and[i+2,..n]using action2to pick them up. We can use binary search to determine the size of this interval so that the number of1s picked up reachesk. Specifically, we binary search for an interval sized, then within the intervals[i-d,..i-2]and[i+2,..i+d], we perform action2to move1s to positionifor pickup. If the number of1s picked up reachesk, we update the answer.
The time complexity is O(n times log n), and the space complexity is O(n). Here, n is the length of the array nums.
Code
Python
Java
C++
Go
TypeScript
Complexity Comparison
| Approach | Complexity |
|---|---|
| Sliding Window Approach | Time Complexity: O(n), as each element is processed at most twice. |
| Dynamic Programming Approach | Time Complexity: O(n^2) if implemented naively |
| Greedy + Prefix Sum + Binary Search | — |
Detailed Complexity Analysis
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Sliding Window + Prefix Sum | O(n) | O(n) | Best general solution. Efficient for large arrays and commonly expected in interviews. |
| Dynamic Programming | O(n * k) | O(n * k) | Useful for understanding state transitions or when experimenting with different constraints. |
Video Solution
3086. Minimum Moves to Pick K Ones | Weekly Leetcode 389 • codingMohan • 1,498 views views
Watch 2 more video solutions →Frequently Asked Questions
Is Minimum Moves to Pick K Ones easy or hard?
Minimum Moves to Pick K Ones Python/Java solution
How to solve Minimum Moves to Pick K Ones in O(n)?
What is the best approach for Minimum Moves to Pick K Ones?
Is Minimum Moves to Pick K Ones asked at Google/Amazon/Meta?
What data structure is used in Minimum Moves to Pick K Ones?
What is the time complexity of Minimum Moves to Pick K Ones?
Ready to solve this problem?
Practice Minimum Moves to Pick K Ones with our built-in code editor and test cases.
Practice on FleetCode