力扣1004. 最大连续1的个数III[#### 1004. 最大连续1的个数 III]
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
示例 1:
输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:
[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
示例 2:
输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
public int longestOnes(int[] A, int K) {
int length = A.length;
//考虑为空串的情况
if( length < 1 ){
return 0;
}
//找到所有为零的下标
int []zero = new int[length + 5];
zero[0] = 0;
int zeroIndex = 1;
for( int i = 0 ; i < length ; i ++ ){
if( A[i] == 0 ) {
//记录所有零的下标
zero[zeroIndex++] = i + 1 ;
}
}
zero[zeroIndex] = length + 1 ;
//考虑K的数值大于串里面总的0的个数
if( zeroIndex - 1 <= K ){
return length;
}
//现在就是找k个连续的零,算出最大值
int max1 = -1;
//左边界和右边界都已经处理好了
//System.out.println( K );
//考虑K为零的情况
if( K == 0 ){
for( int i = 1 ; i <= zeroIndex ; i ++ ){
max1 = Math.max( max1 , zero[i] - zero[i -1] - 1 );
}
return max1;
}
//K不为零的情况
for( int i = 1 ; i < zeroIndex ; i ++ ){
//System.out.println( i + " " + zero[i] );
if( i + K - 1 < zeroIndex ){
//System.out.println( zero[ i + K ] + " " + zero[ i - 1 ] );
max1 = Math.max( max1 , zero[ i + K ] - zero[ i - 1 ] - 1 );
}
}
return max1;
}