作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/max-consecutive-ones-iii/

题目描述

Given an array A of 0s and 1s, we may change up to K values from 0 to 1.

Return the length of the longest (contiguous) subarray that contains only 1s.

Example 1:

Input: A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
Output: 6
Explanation:
[1,1,1,0,0,1,1,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.

Example 2:

Input: A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
Output: 10
Explanation:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.

Note:

  1. 1 <= A.length <= 20000
  2. 0 <= K <= A.length
  3. A[i] is 0 or 1

题目大意

数组A只包含有0和1,可以把其中的K个0翻转成1,问翻转之后最多能有多少个连续的1?

解题方法

虫取法/双指针

这个题最开始的想法是DP,但是没做出来。其实最简单的方法是虫取法或者叫做双指针。

[left, right]双闭区间表示一个经过一定次数的翻转后已经全部是1的区间。我们要求的长度就是这个区间的最大长度。我们需要把这个区间内的所有0都翻转成1,使用变量zero统计该区间内的被翻转的0的个数。易知,zero <= K.

我们把left和right的起始位置都设定为0,我们每次都向右移动一次right指针代表新判断一个元素。此时,如果right指向的数字是0,我们需要将zero+1,代表我们把这个0进行了翻转。然后我们就会想,如果翻转之后zero > K了怎么办?所以我们此时需要移动left指针啊!left有可能指向了1,所以需要一直移动直至zero <= K为止。

使用res保存最大区间长度即可。

那么为什么这个方法可行呢?

严格证明我不会,我只能说下我怎么理解这个方法。这个方法是常见的虫取法,这个虫取法的精髓是保证每次取到的区间是一个严格满足题目要求的区间。具体到这个题目来说就是维护了一个最多翻转K个0的全1区间。只要这个维护是有效的,那么我们就可以根据区间长度更新res。维护的过程我在上面已经讲解,核心是区间内统计0的个数,不过这个统计不是每次都遍历一次区间,而是使用一个变量,这个变量和区间同时维护即可。

C++代码如下:

class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int res = 0;
int left = 0;
int zero = 0;
const int N = A.size();
for (int right = 0; right < N; ++right) {
if (A[right] == 0)
++zero;
while (zero > K) {
if (A[left++] == 0)
--zero;
}
res = max(res, right - left + 1);
}
return res;
}
};

日期

2019 年 3 月 3 日 —— 3月开始,春天到了

最新文章

  1. c++学习笔记1
  2. iOS中为网站添加图标到主屏幕
  3. smartjs - DataManager 场景示例分析 - 数据懒加载
  4. 在Asp.Net Core中添加区域的简单实现
  5. Windows 右键添加「cmd 打开」
  6. 【转】Linux 技巧: Bash 参数和参数扩展
  7. spring framework 各版本源码下载地址
  8. Qt学习之路(34): 国际化(下)
  9. emjio表情转json
  10. 关于pydev的语法的错误提示
  11. 三、js的函数
  12. python--socket/Socketerver并发/udp
  13. [转]XHR简介
  14. Hadoop-2.7.3-src 源码编译
  15. 不指定源ip时,系统选择哪个ip作为ping包的源ip?
  16. mybatis相关知识
  17. week07 13.3 NewsPipeline之 三News Deduper之 tf_idf 查重
  18. 软件工程APP进度更新
  19. P3924 康娜的线段树(期望)
  20. JQuery.Ajax()的data参数传递方式

热门文章

  1. miRNA分析--靶基因预测(三)
  2. Python基础之列表内置方法
  3. Oracle-SQL语句的语法顺序和执行顺序
  4. 10 — springboot整合mybatis — 更新完毕
  5. cephfs文件系统场景
  6. 零基础学习java------29---------网络日志数据session案例,runtime(导出jar程序)
  7. haproxy动态增减主机与keepalived高级应用
  8. Google Guava 常用集合方法
  9. 【Linux】【Commands】systemd
  10. idea maven 项目 遇到 &quot;Module not specified&quot; 解决方法