problem:2134. 最少交换次数来组合所有的 1 II
思路:先找1的数量即为k,转换为找长度为k的定长滑动窗口中最多的1的个数cnt,k-max_cnt即为答案。
前缀和亦可以做
Accode:
class Solution {
public:
int minSwaps(vector<int>& nums) {
int cnt_one = 0;
int ans = 0;
for(auto item:nums){
if(item) cnt_one++;
}
nums.insert(nums.end(),nums.begin(),nums.end());
deque<int> deq;
for(int i=0;i<nums.size();i++){
if(deq.size() && i-deq.front()+1>cnt_one){
deq.pop_front();
}
if(nums[i]) deq.push_back(i);
if(i+1>=cnt_one) ans = max(ans,(int)deq.size());
}
return cnt_one-ans;
}
};
时间复杂度:$o(n)$