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