最长全1串, 美团笔试题
Posted lixyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长全1串, 美团笔试题相关的知识,希望对你有一定的参考价值。
思路:维护一个最多有K个0存在的滑动窗口,用窗口中的元素数量(该窗口中所有0都可以变成1)更新答案。
因此,统计【0,i】区间内0的数量,到下标i
的映射。i作为滑动窗口的右端点, 通过以下方式计算出滑动窗口的左端点,进而得到窗口内元素的数量(right - left + 1
, 闭区间[left, right])。
如果当前0累计出现的次数不大于K次, 则可以将i
左侧所有0变成1,左端点为0
。
如果当前0累计出现次数(记为count
)大于K次,我们只能最多将最近的K个0变成1,前 count - k
个0 无法变成1, 因此左端点为 map.get(count-k) + 1
。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), k = sc.nextInt();
int[] a = new int[n];
for(int i=0; i < n; i++) {
a[i] = sc.nextInt();
}
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 0);// 0的数量:当前位置
int res = 0, count = 0;
for(int i=0; i < n; i++) {
if(a[i] == 0) {
++count;
map.put(count, i); // 0的数量:当前位置
}
if(count >= k)
res = Math.max(res, i-map.get(count-k));
else
res = Math.max(res, i+1);
}
System.out.println(res);
}
}
以上是关于最长全1串, 美团笔试题的主要内容,如果未能解决你的问题,请参考以下文章