# LC 2134. Minimum Swaps to Group All 1's Together II ### [Problem link](https://leetcode.com/problems/minimum-swaps-to-group-all-1s-together-ii/) ###### tags: `leedcode` `medium` `c++` `Sliding Window` A **swap** is defined as taking two **distinct** positions in an array and swapping the values in them. A **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 <code>nums</code>, return the minimum number of swaps required to group all <code>1</code>'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:** - <code>1 <= nums.length <= 10<sup>5</sup></code> - <code>nums[i]</code> is either <code>0</code> or <code>1</code>. ## Solution 1 - Sliding Window #### C++ ```cpp= class Solution { public: int minSwaps(vector<int>& nums) { int cnt1 = accumulate(nums.begin(), nums.end(), 0); int cnt = 0; for (int i = 0; i < cnt1; i++) { cnt += nums[i]; } int ans = cnt1 - cnt; for (int i = 0; i < nums.size(); i++) { if (cnt1 - 1 - i >= 0) { cnt -= nums[cnt1 - 1 - i]; } else { cnt -= nums[nums.size() + (cnt1 - 1 - i)]; } cnt += nums[nums.size() - 1 - i]; ans = min(ans, cnt1 - cnt); } return ans; } }; ``` >### Complexity >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(n) | O(1) | ## Note x