- 難度分: 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;
}
};