package shuangzhizhen; /* 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。 提示: 1 <= A.length <= 20000 0 <= K <= A.length A[i] 为 0 或 1 解题思路: 维护一个滑动窗口 当 A[right] = 1 时,left 不变,right 继续移动 当 A[right] = 0 时, 0 的数量在 K 的范围内,left 不变,right 继续移动 0 的数量 > K, 当 A[left] == 0 时,即 left 指向了一个零,只需要 left 右移一格,就可以减少一个零 当 A[left] == 1 时,即此时窗口内包了 K 个零,需要先移动至下个零,再右移一格才能减少一个零 */ public class p1004 { public static int longestOnes(int[] A, int K) { int len=A.length; int left=0,right=0,res=0; for(;right<len;right++){ if(A[right]==0){ if(K>0){ K--; } else { while (A[left]==1)left++; left++; } } res=Math.max(res,right-left+1); } return res; } public static void main(String[] args) { int a[]={0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1}; System.out.println(longestOnes(a,3)); } }
运行结果: