本题折磨了很久,写了三种方法

  • queue入队,保证队列中刚好k个-1:60%,写的太乱就不放了
  • 把连续的0和1合并,组成一个正负相间的数组,见注释部分的代码:80%
  • 双指针:参考评论区大佬:未注释部分
    package org.niuke.solution80;
    

import java.util.*;

public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] ints = new int[n];
for(int i = 0; i < n; i++){
ints[i] = scanner.nextInt();
}
int start = 0, cnt = 0, len = 0;
for(int i = 0; i < ints.length; i++){
if(ints[i] == 0){
cnt++;
}
if(cnt > k){
len = Math.max(len, i - start);
while (ints[start] == 1) {
start++;
}
start++;
cnt--;
}
// System.out.println(i + " cnt " + cnt + " start:" + start + " len:" + len);
}
len = Math.max(len, n - start);
System.out.println(len);

    //        int l = 0, r = 0, cnt = 0;
    //        Deque<Integer> deque = new LinkedList<>();
    //
    //        for(int i = 0; i < n; i++){
    //            int temp = ints[i];
    //            if(i == 0){
    //                deque.addLast(temp == 0 ? -1 : 1);
    //            }else{
    //                int last = deque.pollLast();
    //                if(last < 0 && temp == 0){
    //                    deque.addLast(last - 1);
    //                }else if(last > 0 && temp == 1){
    //                    deque.addLast(last + 1);
    //                }else{
    //                    deque.addLast(last);
    //                    deque.addLast(temp == 0 ? -1 : 1);
    //                }
    //            }
    //        }
    //        int[] res = new int[deque.size()];
    //        for(int i = 0; i < res.length; i++){
    //            res[i] = deque.pollFirst();
    //        }
    //
    //        int len = 0;
    //        for(int i = 0; i < res.length; i++){
    //            int lenTemp = 0, zero = k;
    //            for(int j = i; j < res.length; j++){
    //                if(zero + res[j] < 0){
    //                    len = Math.max(len, lenTemp + zero);
    //                    break;
    //                }else{
    //                    zero += Math.min(res[j], 0);
    //                    lenTemp += Math.abs(res[j]);
    //                }
    //            }
    //
    //        }
    //        System.out.println(len);
}

}

```