【算法专题突破】双指针 - 最大连续1的个数 III(11)

简介: 【算法专题突破】双指针 - 最大连续1的个数 III(11)

1. 题目解析

题目链接:1004. 最大连续1的个数 III - 力扣(Leetcode)

这道题不难理解,其实就是求出最长的连续是1的子数组,

但是,他支持了一个操作,就是可以翻转k个0变成1。

这个条件一出来,这道题的难度就上来了,情况变得比较的复杂。

2. 算法原理

然后我们就可以想一想应该怎么抽象出一条规则:

将这个问题转化成:找出最长的子数组,0的个数不超过k个即可,

如果使用暴力枚举,思路还是比较简单的。

基于暴力枚举,我们可以使用滑动窗口来优化这道题,

其实最难的一步:转化问题我们已经做完了,我们只需要根据这个思路设计滑动窗口即可,

我们维护一个窗口,

当0的数量小于2的时候,不断扩大窗口,

当0的数量等于2的时候,我们记录最长的子数组,

当0的数量大于2的时候,我们缩小窗口,直到0的数量小于等于2

来看代码:

3. 代码编写

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        unordered_map<int, int> win;
        int len = 0, left = 0, right = 0;
        while(right < nums.size()) {
            len = max(len, right - left);
            win[nums[right++]]++;
            while(left < nums.size() && win[0] > k) {
                win[nums[left++]]--;
            }
        }
        len = max(len, right - left);
        return len;
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
2天前
|
存储 算法 容器
算法:双指针
算法:双指针
11 3
|
18天前
|
算法 前端开发 JavaScript
< 每日算法:一文带你认识 “ 双指针算法 ” >
`双指针`并非指的是一种具体的公式或者范式。而是一种运算思路,用于节省逻辑运算时间的`逻辑思路`!双指针算法通常用于`优化时间复杂度`!
< 每日算法:一文带你认识 “ 双指针算法 ” >
|
22天前
|
算法
|
29天前
|
算法
优选算法|【双指针】|611.有效三角形的个数
优选算法|【双指针】|611.有效三角形的个数
|
29天前
|
算法
优选算法|【双指针】|202.快乐数
优选算法|【双指针】|202.快乐数
|
29天前
|
算法
优选算法|【双指针】283.移动零
优选算法|【双指针】283.移动零
|
29天前
|
算法
优选算法|【双指针】|1089.复写零
优选算法|【双指针】|1089.复写零
|
29天前
|
算法
【优选算法专栏】专题一:双指针--------1.移动0
【优选算法专栏】专题一:双指针--------1.移动0
19 0
|
1月前
|
算法 C++
双指针算法·两数之和·三数之和
双指针算法·两数之和·三数之和
8 0
|
1月前
|
算法 C++ 容器
day1·算法-双指针
day1·算法-双指针
9 0