当前位置: 首页 > article >正文

算法练习:1004. 最大连续1的个数 III

题目链接:1004. 最大连续1的个数 III。

题目要求,给定一个数组,这个数组里面只有0或1,然后计算有多少个连续的1的最大长度,同时给了一个条件就是,可以把k个0变成1,然后来计算长度。

暴力解法:枚举每一个子数组,记录连续为1的长度,同时用一个计数器cut来统计0的个数。

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size();
        int sum = INT_MIN;
        for(int i = 0;i < n;i++)
        {
            int cut = 0;
            int sum1 = 0;
            for(int j = i;j < n;j++)
            {
                if(nums[j] == 0)
                {
                    cut++;
                }
                if(cut == k+1)
                {
                    break;
                }
                sum1++;
            }
            sum = sum1 > sum ? sum1 : sum;
        }
        return sum;
    }
};

但是暴力解法会超时!!!

在暴力解法前提下进行对代码的优化:

  • 通过定义两个指针来控制,left固定在第一个位置,right进行移动,定义cut当计数器
  • 如果right对应值为1,则无视,直接++
  • 如果right对应值为0,则cut++,right也++
  • 判断,如果cut > k,则开始移动left
  • 如果left对应值为1,无视,直接++
  • 如果对应值为0,则cut--,left也++
  • 判断完就进行更新长度

为什么判断cut > k后要进行移动left,而right不动,因为left到right之间0的个数已经超过k,此时right在回到left位置重新进行检测长度,没有必要,因为重新检测的长度肯定比之前长度短,所以只需要更新left,更新到cut=k的位置,然后再进行移动right。

这样同向双指针操作叫做滑动窗口。

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0,right = 0,cut = 0;
        int n = nums.size();
        int ret = 0;
        while(left<n && right < n)
        {
            if(nums[right] == 0) cut++;
            while(cut > k)
            {
                if(nums[left] == 0) cut--;
                left++;
            }
            ret = max(ret , right - left + 1);
            right++;
        }
        return ret;
    }
};


http://www.kler.cn/a/383490.html

相关文章:

  • 【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹
  • C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容
  • 知识图谱+RAG学习
  • Chrome 关闭自动添加https
  • 【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget
  • 【游戏设计原理】22 - 石头剪刀布
  • 基于SSM+VUE守护萌宠宠物网站JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
  • ORACLE 19C 安装数据库补丁的详细过程
  • 利用全排列解决LeetCode第3343题“统计平衡排列的数目”问题
  • 【Java SE语法】抽象类(abstract class)和接口(interface)有什么异同?
  • 一个国产 API 开源项目,在 ProductHunt 杀疯了...
  • 【HarmonyOS】引导用户跳转APP设置详情页开启权限
  • AI预测体彩排3采取888=3策略+和值012路+胆码+通杀1码测试11月7日升级新模型预测第127弹
  • AI在创造还是毁掉音乐?
  • Vue 指令
  • ENSP RIP动态路由
  • HLS SAMPLE-AES加密方法
  • 京东毫秒级热key探测框架JD-hotkey
  • 哈希表,哈希桶及配套习题
  • 数据分析:转录组差异fgsea富集分析
  • 第08章 排序ORDER BY
  • 创新实践:基于边缘智能+扣子的智慧婴儿监控解决方案
  • 歌词结构的艺术:写歌词的技巧和方法深度剖析,妙笔生词AI智能写歌词软件
  • 一篇掌握springboot集成gRPC
  • dcdc3节锂电池串联9-12V升压32V 3A/5A 音响供电恒压芯片 SL4010
  • CentOS 7 更换软件仓库