2134. Minimum Swaps to Group All 1’s Together II

swap is defined as taking two distinct positions in an array and swapping the values in them.

circular array is defined as an array where we consider the first element and the last element to be adjacent.

Given a binary circular array nums, return the minimum number of swaps required to group all 1‘s present in the array together at any location.

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 01:

#include <vector>
#include <algorithm>
#include <ranges>

using namespace std;

class Solution {
public:
    int minSwaps(vector<int>& nums) {
        const int n = nums.size(); // Size of the input vector
        const int totalOnes = ranges::count(nums, 1); // Total count of 1s in the input vector
        int currentOnesInWindow = 0; // The number of 1s in the current window
        int maxOnesInWindow = 0; // The maximum number of 1s in any window

        for (int i = 0; i < n * 2; ++i) {
            if (i >= totalOnes && nums[(i - totalOnes) % n])
                --currentOnesInWindow; // Remove the element that is sliding out of the window
            if (nums[i % n])
                ++currentOnesInWindow; // Add the new element sliding into the window
            maxOnesInWindow = max(maxOnesInWindow, currentOnesInWindow); // Update the maximum number of 1s found in any window
        }

        return totalOnes - maxOnesInWindow; // Minimum swaps required is total 1s minus the maximum 1s in a window
    }
};
from typing import List

class Solution:
    def minSwaps(self, nums: List[int]) -> int:
        n = len(nums)  # Size of the input list
        totalOnes = nums.count(1)  # Total count of 1s in the input list
        currentOnesInWindow = 0  # The number of 1s in the current window
        maxOnesInWindow = 0  # The maximum number of 1s in any window

        for i in range(n * 2):
            if i >= totalOnes and nums[(i - totalOnes) % n] == 1:
                currentOnesInWindow -= 1  # Remove the element that is sliding out of the window
            if nums[i % n] == 1:
                currentOnesInWindow += 1  # Add the new element sliding into the window
            maxOnesInWindow = max(maxOnesInWindow, currentOnesInWindow)  # Update the maximum number of 1s found in any window

        return totalOnes - maxOnesInWindow  # Minimum swaps required is total 1s minus the maximum 1s in a window

Time Complexity

  • Initialization and Counting:

    Counting the total number of 1s in the array nums takes \( O(n) \) time.

  • Sliding Window:

    The sliding window mechanism iterates through the array twice (due to wrapping around), resulting in \( O(2n) \) operations. This simplifies to \( O(n) \).

  • Overall Time Complexity:

    The overall time complexity is \( O(n) \).

Space Complexity

  • Auxiliary Space:

    The algorithm uses a constant amount of additional space for variables such as totalOnes, currentOnesInWindow, and maxOnesInWindow. Therefore, the auxiliary space complexity is \( O(1) \).

  • Overall Space Complexity:

    The overall space complexity is \( O(1) \).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top