欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 1004.最大连续1的个数 Max Consecutive Ones III Java版本

程序员文章站 2024-03-06 09:48:25
...

题目地址: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.

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

示例 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]

示例 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]

Note:

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

思路:双区间,滑动窗口
[left,right]的区间表示一个经过一定次数的翻转后已经全部是1的区间。就是在从头到尾的遍历中找到那个最大的区间。需要把区间里面所有的0都翻转成1,那么使用遍历zero表示区间里面需要翻转的0的个数(zero<=k)允许最大k次翻转,将left和right指针初始都指向0位置,我们每次移动right指针代表判断一个元素。此时,如果right指针遇到一个0那么zero+1,代表 把这个0翻转了,如果zero>k时,那么就要移动left指针,直到left指针指向一个0的位置,再将他右移一位,代表从这个窗口里面删除一个0,那么zero–,直到zero<=k,用max每次记录最大值。

public static int longestOnes(int[] A, int K) {
		if(A==null||A.length<=0) return 0;
		int left=0;		
		int zero=0;
		int max=0;//记录最大区间值
		for(int i=0;i<A.length;i++) {
			if(A[i]==0) {
				zero++;
			}
			while(zero>K) {//直到滑动窗口里面zero<=K
				if(A[left]==0) {
					left++;
					zero--;
				}else {
					left++;
				}
			}
			//每次更新max
			max=Math.max(max, i-left+1);
		}
		System.out.println(max);
		return max;
    }