首页 > 其他分享 >力扣刷题记录: 2134. 最少交换次数来组合所有的 1 Ⅱ

力扣刷题记录: 2134. 最少交换次数来组合所有的 1 Ⅱ

时间:2024-05-27 20:29:08浏览次数:21  
标签:2134 窗口 nums int 力扣 这道题 数组 滑动 刷题

        这道题是第275场周赛的 Q2,LC竞赛分为 1748,主要考察滑动窗口。说实话这道题要想到是滑动窗口就很简单,否则就根本无从下手。

方法一. 滑动窗口(时间超过62.53%C++用户)

        处理环形数组的一个很有效的技巧就是 “追加”,把整个nums数组追加到nums数组后面,比如说 1,0,1,1 变成 1,0,1,1,1,0,1,1。这样就可以做到“首尾相接”这一效果。基本上所有环形数组题都可以这么预处理。我们这题也先用追加法预处理数组。

        我们计算原数组含有1的个数total_ones,那么我们的环形数组里所有1相邻的含义就变成了:在完成追加后的新数组里,找到一个长度为total_ones的子数组,这个子数组里全是1。因此交换的次数对应着子数组中含0的个数。只要找到含0个数最小的子数组,其含0的个数就是交换的最小次数。这个子数组的寻找需要用滑动窗口将复杂度降到O(n),否则会超时。

        这道题关键在于看出它是个滑动窗口,看不出来的话全部白瞎,我觉得思路挺复杂的。

        代码如下:

class Solution {
public:
    int minSwaps(vector<int>& nums) {
        if(nums.size()==1) return 0;

        int n = nums.size();
        for(int i=0;i<n;i++){
            nums.push_back(nums[i]);
        }

        int total_ones = 0;
        for(int i=0;i<n;i++) total_ones += (nums[i]==1);

        int left = 0,right = total_ones -1;
        int tmp=0;
        for(int i=left;i<=right;i++){
            tmp+=(nums[i]==1);
        }
        int res = total_ones-tmp;
        while(right<2*n-1){
            right++;
            left++;
            tmp -= (nums[left-1]==1);
            tmp += (nums[right]==1);
            res = min(res,total_ones-tmp);
        }
        return res;
    }
};

标签:2134,窗口,nums,int,力扣,这道题,数组,滑动,刷题
From: https://blog.csdn.net/Bright_Brilliant/article/details/139217682

相关文章

  • NSS刷题心得1(古典+RSA)
    古典密码在线工具:https://ctf.bugku.com/tools.html一键解码工具库:随波逐流,在github上下载即可注:古典密码只需做个了解,因为很多都是靠工具实现的,多刷题有个印象,遇到题能看出像什么密码就好。Base家族在密码学领域,"base"通常指的是一种编码方式,用于将二进制数据转换为可......
  • LeetCode刷题之HOT100之两数相加
    2024/5/27大家早上好呀,昨晚没睡好,四个小时不到,估计是太兴奋了。昨天去长乐十七孔、下沙赶海啦。远看沙滩上的人群就像一根根木桩矗立在浅滩上,走近些,才发现都佝偻着腰,两只手在沙地淘金(摸花蛤)。放几张图图一、十七孔水库附近图二、十七孔——右侧礁石是妈祖像图三、追......
  • 算法刷题笔记 前缀和(C++实现)
    文章目录题目描述基本思路实现代码题目描述输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数......
  • 算法刷题笔记 数的范围(C++实现)(二分法重要例题)
    文章目录题目描述题目思路题目代码(C++)题目感想题目描述给定一个按照升序排列的长度为n的整数数组,以及q个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回-1-1。输入格式:第一行包含整数n和q,表示数组长度和询......
  • leetcode力扣 300. 最长递增子序列
    给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是[2,3,7,101......
  • 力扣 32. 最长有效括号 python AC
    动态规划classSolution:deflongestValidParentheses(self,s):s=''+ssize=len(s)dp=[0]*sizeforiinrange(2,size):ifs[i]==')':ifs[i-1]=='(':......
  • leetcode力扣 1004. 最大连续1的个数 III
    给定一个二进制数组nums和一个整数k,如果可以翻转最多k个0,则返回数组中连续1的最大个数。示例1:输入:nums=[1,1,1,0,0,0,1,1,1,1,0],k=2输出:6解释:[1,1,1,0,0,1,1,1,1,1,1],翻转两个0后,最长的子数组长度为6。示例2:输入:nums=[0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1......
  • 自用:常见算法竞赛/刷题问题 & 模板
    以下是我平常刷题遇到的部分常见问题,随手记录一下。(不定时更新)基本算法二维前缀和for(inti=1;i<=m;++i){ for(intj=1;j<=n;++j) { pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+nums[i][j]; }}//异或版本for(inti=1;i......
  • 力扣数组题分享
    文章目录前言二分查找思路二分法第一种写法二分法第二种写法螺旋矩阵II思路结尾前言在学习数据结构的过程中,我通过力扣整理了一些常见的数据结构数组题。这些题目帮助我回顾了学习过程中的关键知识点。二分查找力扣题目704.二分查找给定一个n个元素有序......
  • leetcode力扣 2024. 考试的最大困扰度
    一位老师正在出一场由n道判断题构成的考试,每道题的答案为true(用'T'表示)或者false(用'F'表示)。老师想增加学生对自己做出答案的不确定性,方法是最大化有连续相同结果的题数。(也就是连续出现true或者连续出现false)。给你一个字符串answerKey,其中answerKey[i]是第i......