Problem
You have n
boxes. You are given a binary string boxes
of length n
, where boxes[i]
is '0'
if the ith
box is empty, and '1'
if it contains one ball.
In one operation, you can move one ball from a box to an adjacent box. Box i
is adjacent to box j
if abs(i - j) == 1
. Note that after doing so, there may be more than one ball in some boxes.
Return an array answer
of size n
, where answer[i]
is the minimum number of operations needed to move all the balls to the ith
box.
Each answer[i]
is calculated considering the initial state of the boxes.
Examples
Example 1:
|
|
Example 2:
|
|
Constraints
n == boxes.length
1 <= n <= 2000
boxes[i]
is either'0'
or'1'
.
Similar Problems
Product of Array Except Self Trapping Rain Water
Solution
Video explanation
Here is the video explaining this method in detail. Please check it out:
Method 1 - Naive
The naive way will be for each box at index i
in the string boxes
, we calculate its distance to box at index j
, if boxes[j]
has a ball, i.e. boxes[j] == 1
, and sum up all the distances.
Code
|
|
|
|
Complexity
- ⏰ Time complexity:
O(n^2)
due to nested loop - 🧺 Space complexity:
O(1)
Method 2 - Using Prefix Sum
- *Initial Observations
- For each box, the number of operations to bring all balls to it is the sum of distances from all other boxes containing balls.
- To directly calculate the distances, we can precompute the results using prefix sums.
- Forward Pass
- Traverse from left to right, maintaining the number of balls seen so far and the total distance needed to bring these balls to the current box.
- Use a cumulative sum to store distances.
- Backward Pass
- Traverse from right to left, maintaining the same information, updating the distances similarly.
- Result Combination
- Combine results from the forward and backward passes to get the minimum operations for each box.
Code
|
|
|
|
Complexity
- ⏰ Time complexity:
O(n)
because we traverse the list twice. - 🧺 Space complexity:
O(n)
to store the answer