• 難度分: 1748
  • 遇到 circular 的問題都可以換位思考,這題可以想成「min swaps to group all 1」或「min swaps to group all 0」
class Solution {
public:
    int minSwaps(vector<int>& nums) {
        int n = nums.size();
        int k = accumulate(nums.begin(), nums.end(), 0);
        return min(minSwapsHelper(nums, 1, k), minSwapsHelper(nums, 0, n-k));
    }
    int minSwapsHelper(vector<int>& nums, int target, int k) {
        int n = nums.size();
        int curr = 0;
        for (int i = 0; i < k; i++) {
            if (nums[i] == target) curr++;
        }
        int cnt = curr;
        for (int i = k; i < n; i++) {
            if (nums[i] == target) curr++;
            if (nums[i-k] == target) curr--;
            cnt = max(cnt, curr);
        }
        return k - cnt;
    }
};