Minimum Swaps to Group All 1's Together II

Updated on 19 June, 2025
Minimum Swaps to Group All 1's Together II header image

Problem Statement

In problems involving circular arrays where the first and last array elements are adjacent, understanding operations like swaps becomes vital. In this task, we're given a binary circular array nums, consisting exclusively of 0s and 1s. The objective is to calculate the minimum number of swaps needed to aggregate all the 1s together in the array. Here, a swap is described as the action of exchanging values between any two distinct positions within the array.

Examples

Example 1

Input:

nums = [0,1,0,1,1,0,0]

Output:

1

Explanation:

Here are a few of the ways to group all the 1's together:
[0,0,1,1,1,0,0] using 1 swap.
[0,1,1,1,0,0,0] using 1 swap.
[1,1,0,0,0,0,1] using 2 swaps (using the circular property of the array).
There is no way to group all 1's together with 0 swaps.
Thus, the minimum number of swaps required is 1.

Example 2

Input:

nums = [0,1,1,1,0,0,1,1,0]

Output:

2

Explanation:

Here are a few of the ways to group all the 1's together:
[1,1,1,0,0,0,0,1,1] using 2 swaps (using the circular property of the array).
[1,1,1,1,1,0,0,0,0] using 2 swaps.
There is no way to group all 1's together with 0 or 1 swaps.
Thus, the minimum number of swaps required is 2.

Example 3

Input:

nums = [1,1,0,0,1]

Output:

0

Explanation:

All the 1's are already grouped together due to the circular property of the array.
Thus, the minimum number of swaps required is 0.

Constraints

  • 1 <= nums.length <= 105
  • nums[i] is either 0 or 1.

Approach and Intuition

To solve the task of grouping all 1s together with the minimal swaps, let's consider breaking down the solution:

  1. Identify the total count of 1s in the array which gives us an insight on the eventual block size we are trying to group.
  2. Utilize the sliding window technique with a window size equivalent to the number of 1s. This technique involves moving a fixed-size window across the array to find a suitable location where swaps are minimized.
  3. Calculate 1s outside the current window: For each possible window in the circular array, calculate how many 1s are outside it. This gives the total number of 1s we'd need to move inside the window to make it all ones, which indirectly gives us the swaps.
  4. Employ the circular property: The key challenge in this problem as compared to a non-circular array is handling the wrap-around. This means a window might start at the end of the array and wrap to the beginning.
  5. Determine the minimum swaps: For each window position, by counting how many zeros it contains, we can get the number of required swaps as we need to replace these zeros with ones from outside the current window.

By iterating through different starting positions of the window and monitoring the count of 1s outside it, we aim to find the configuration that requires the least swaps. This approach guarantees a thorough examination due to its systematic exploration of all possible groups of consecutive 1s within the array's circular structure.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int findMinSwaps(vector<int>& data) {
        int minSwapsNeeded = INT_MAX;
        int onesTotal = accumulate(data.begin(), data.end(), 0);
        int currentOnes = data[0];
        int windowEnd = 0;

        for (int windowStart = 0; windowStart < data.size(); ++windowStart) {
            if (windowStart != 0) {
                currentOnes -= data[windowStart - 1];
            }
            while (windowEnd - windowStart + 1 < onesTotal) {
                windowEnd++;
                currentOnes += data[windowEnd % data.size()];
            }
            minSwapsNeeded = min(minSwapsNeeded, onesTotal - currentOnes);
        }

        return minSwapsNeeded;
    }
};

The solution provided tackles the problem of finding the minimum number of swaps needed to group all occurrences of 1s together in a circular array. The function is defined in C++ within a class named Solution. It employs a sliding window algorithm to efficiently determine the smallest swap count necessary.

  • Initially, calculate the total number of 1's in the array data using the accumulate function.
  • A sliding window approach is then used. Initiate minSwapsNeeded with the maximum possible value (INT_MAX).
  • Loop through the array with windowStart ranging from 0 to the size of data.
  • Adjust the number of 1's in the current window (currentOnes) by either adding or subtracting elements as the window slides.
  • The variable windowEnd is adjusted to ensure the window size is equal to the onesTotal.
  • Calculate potential swaps for each window position and update minSwapsNeeded.
  • Return minSwapsNeeded at the end, which will be the smallest number of swaps needed to cluster all 1s together in the circular array.

This approach ensures optimal efficiency by utilizing a single pass evaluation of potential window positions and updates the minimum swaps required dynamically, making it efficient and succinct.

java
class Solution {

    public int minimumSwapsRequired(int[] data) {
        int minSwaps = Integer.MAX_VALUE;
        int countOnes = 0;
        for (int value : data) {
            countOnes += value == 1 ? 1 : 0;
        }

        int currentOnes = 0;
        int wrapIndex = 0;

        for (int i = 0; i < data.length; i++) {
            if (i > 0) {
                currentOnes -= data[i - 1];
            }

            while (wrapIndex - i + 1 < countOnes) {
                wrapIndex++;
                currentOnes += data[wrapIndex % data.length];
            }

            minSwaps = Math.min(minSwaps, countOnes - currentOnes);
        }

        return minSwaps;
    }
}

This Java solution addresses the problem of finding the minimum number of swaps needed to group all 1's together in a circular array.

  • Assess the count of 1's in the input array. This count will help in determining the window size for evaluating swaps.
  • Initialize minSwaps to track the least swaps required and set it to the maximum possible value initially.
  • Use a sliding window technique with a fixed length equal to the number of 1's:
    1. Slide through the array to count the number of 1's in each window.
    2. Adjust the window dynamically to account for the circular nature of the array by using modulo operation for indexing.
    3. Calculate the number of swaps needed for each window by subtracting the count of 1's in the current window from the total number of 1’s.
    4. Update minSwaps with the minimum result from all windows.
  • Return minSwaps, which now contains the minimum number of swaps required to group all 1’s together.

This approach ensures efficiency by leveraging a sliding window mechanism rather than evaluating each possible subset, making it well-suited for larger datasets.

python
class Solution:
    def minReplacements(self, data: List[int]) -> int:
        # Set initial min replacements to a large value
        least_replacements = float("inf")
        
        # Count of 1s in the data list
        count_of_ones = sum(data)
        
        # Current count of 1s within the sliding window
        current_ones = data[0]
        pointer = 0

        # Iteratively slide the window across the list
        for initiation in range(len(data)):
            # Decrement current_ones for outgoing element from the window
            if initiation != 0:
                current_ones -= data[initiation - 1]
            
            # Expand the window to the right to correct size
            while pointer - initiation + 1 < count_of_ones:
                pointer += 1
                current_ones += data[pointer % len(data)]

            # Calculate the least replacements needed 
            least_replacements = min(least_replacements, count_of_ones - current_ones)

        return least_replacements

This Python solution addresses the problem of determining the minimum number of swaps required to group all the 1s together in a circular array. Implementing the solution involves the following key elements and logic:

  • The solution uses a sliding window approach to find a contiguous subarray of length equal to the count of 1s in the array that maximizes the number of 1s.
  • Initialize a variable least_replacements to store the minimize number of swaps, starting with a high value.
  • Determine the count of 1s in the array with sum(data).
  • To track the number 1s in the current window, current_ones is initialized with the first element and updates as the window slides.
  • A pointer assists in managing the window's reach as it cycles through the data circularly.
  • For each position in the array:
    • The window adjusts by decreasing current_ones for the outgoing element when the window moves.
    • The window's size expands as required while maintaining the condition that the window covers as many 1s as possible starting from the current position.
    • Update least_replacements every iteration to ensure it holds the minimum value. This value represents the least replacements required by computing the difference between count_of_ones and current_ones.

Ensure correct and effective wrapping of the index when it exceeds the array length using modulo operation, thus enabling the circular arrangement simulation. The use of min function in the iteration consistently updates the minimum replacements needed at each stage, facilitating a direct approach to the final answer. This efficient method leverages sliding window mechanics to optimize calculations over repeatedly recalculating window contents.

Comments

No comments yet.