给定一个由若干 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
思路:双指针,滑动窗口
提交的代码:
class Solution { public int longestOnes(int[] nums, int k) { int i=0,j=0,sum=0,max=0; for(j=0;j<nums.length;) { if(nums[j]==1) { sum++; j++; } else if(nums[j]==0&&k>0) { k--; sum++; j++; } else //如果k为0,且当前字段最后一位为0,向后滑动,前面的字段开始退位 { sum--; if(nums[i]==0) { k++; } i++; } max = Math.max(sum, max); } return max; } }
完整的代码:
public class Solution1004 { public static int longestOnes(int[] nums, int k) { int i=0,j=0,sum=0,max=0; for(j=0;j<nums.length;) { if(nums[j]==1) { sum++; j++; } else if(nums[j]==0&&k>0) { k--; sum++; j++; } else { sum--; if(nums[i]==0) { k++; } i++; } max = Math.max(sum, max); } return max; } public static void main(String[] args) { int[] nums = {0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1}; int k =3; System.out.println(longestOnes(nums,k)); } }