
在一个狭小的路口,每秒只能通过一辆车,假如车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量,三种颜色编号为 0, 1, 2。
第一行输入的是通过的车辆颜色信息。比如[0, 1, 1, 2] 代表 4 秒钟通过的车辆颜色分别是 0, 1, 1, 2第二行输入的是统计时间窗,整型,单位为秒。
输出指定时间窗内经过的最多颜色的车辆数量
0 1 2 1
3
2
在[1,2,1]这个 3 秒时间窗内,1 这个颜色出现 2 次,数量最多
在[1,2,1]这个 3 秒时间窗内,1 这个颜色出现 2 次,数量最多
要解决这个问题,可以使用滑动窗口的技巧。具体来说,我们需要找到一个长度为 N 的子序列,使得这个子序列中出现次数最多的颜色的数量最大。
color_count 来记录每种颜色在当前窗口内的出现次数。left 和 right 来表示当前窗口的左右边界,初始时都指向数组的开头。N 时,移动左指针以保持窗口大小为 N。import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class MaxColorCount {
public static int maxColorCount(int[] colors, int N) {
int n = colors.length;
if (N >= n) {
return n; // 如果 N 大于等于数组长度,直接返回数组长度
}
Map<Integer, Integer> colorCount = new HashMap<>();
int maxCount = 0;
int left = 0;
for (int right = 0; right < n; right++) {
// 更新当前颜色的计数
colorCount.put(colors[right], colorCount.getOrDefault(colors[right], 0) + 1);
maxCount = Math.max(maxCount, colorCount.get(colors[right]));
// 当窗口大小超过 N 时,移动左指针
if (right - left + 1 > N) {
colorCount.put(colors[left], colorCount.get(colors[left]) - 1);
if (colorCount.get(colors[left]) == 0) {
colorCount.remove(colors[left]);
}
left++;
}
}
return maxCount;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] inputColors = scanner.nextLine().split(" ");
int N = scanner.nextInt();
int[] colors = new int[inputColors.length];
for (int i = 0; i < inputColors.length; i++) {
colors[i] = Integer.parseInt(inputColors[i]);
}
System.out.println(maxColorCount(colors, N));
}
}colorCount 是一个哈希表,用于记录每种颜色在当前窗口内的出现次数。maxCount 用于记录当前窗口内出现次数最多的颜色的数量。left 和 right 分别是窗口的左右边界指针。right 指针遍历数组,每次将当前颜色的计数加1,并更新 maxCount。N 时,移动 left 指针以保持窗口大小为 N,同时更新 colorCount。maxCount,即指定时间窗内经过的最多颜色的车辆数量。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。