本题折磨了很久,写了三种方法
- 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);
}}
```

京公网安备 11010502036488号