刷题笔记 day8

文章介绍了一种算法,通过使用同向指针和记录0个数的方法,求解给定数组中0元素不超过k个的最大连续1子数组的长度。Solution类提供了实现这个算法的代码片段。
摘要由CSDN通过智能技术生成

1004 最大连续1的个数 III

        这道题要求将原数组中的0翻转成1,求出最大元素全是1的子数组长度,看这道题第一感觉还要将里面的0变成1,感觉这道题解决起来很麻烦,但是我们可以转变思路,找出其最大子数组,使得子数组里面0元素的个数不超过 k,然后求其子数组长度。

算法步骤:

        1. 利用同向指针 left 和 right 指向数组的第一个下标位置;

        2. 让 right 指针往数组后面走,使用记录 0 个数的变量 count ;

            当count > k 时,说明 [left,right)区间内 0 的个数已经大于  k  ;

            然后让 left 往右走 , 减小 0 的个数即--count,当 count 不大于 k 时结束,

       3. 更新子数组长度的结果。

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left =0,  right = 0 ;
        int maxSum = 0; //记录最长子数组的长度
        int count = 0; // 记录 0 的个数
        while(right < nums.size())
        {
            if(nums[right] == 0)
            {
                ++count;
            }
            while(count > k)
            {
                if(nums[left++] ==0)
                {
                    --count;
                }
            }
            //更新结果
            maxSum = max(maxSum,right-left+1);
            ++right;
        }
        return maxSum;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值