2134. 最少交换次数来组合所有的 1 II

题目描述

alt

解题思路

设数组中1的数量为len,维护一个长度为len的滑动窗口,从左向右扫描一遍数组,对于每个窗口,需要交换的次数就是窗口中0的数量。 环形数组可以把数组想象成二倍的原数组,使用模运算加以简化,这样ij就不需要特殊处理了!

代码

class Solution {
public:
    int minSwaps(vector<int>& nums) {

        int n = nums.size();

        int len = 0;//1的数量
        for(auto &x : nums) len += x;

        if(len >= nums.size()) return 0;

        int ans = 0, cnt = 0;//cnt代表1的数量
        for(int i = 0, j = 0; i < len + n; i++)
        {
            cnt += nums[i % n];//扩展有边界
            if(i - j + 1 == len) 
            {
                ans = max(ans, cnt);//问题的逻辑
                cnt -= nums[(j++)%n];//收缩左边界
            }
        }

        return len - ans;
        
    }
};
全部评论

相关推荐

06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务