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;
}
上一篇: 两种JAVA实现短网址服务算法
下一篇: ArrayS工具类