遇到 circular 的問題都可以換位思考,這題可以想成「min swaps to group all 1」或「min swaps to group all 0」
classSolution {
public:int minSwaps(vector<int>& nums) {
int n = nums.size();
int k = accumulate(nums.begin(), nums.end(), 0);
returnmin(minSwapsHelper(nums, 1, k), minSwapsHelper(nums, 0, n-k));
}
intminSwapsHelper(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;
}
};