目录
题目描述
小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有 N 行。其中每一行的格式是:
ts id
表示在 ts 时刻编号 id 的帖子收到一个"赞"。
现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是"热帖"。
具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是"热帖"。
给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。
输入描述
输入格式:
第一行包含三个整数 N,D,K。
以下 N 行每行一条日志,包含两个整数 ts 和 id。
其中,1 ≤ K ≤ N ≤ 105 , 0 ≤ ts ≤ 105 , 0 ≤ id ≤ 105 。
输出描述
按从小到大的顺序输出热帖 id。每个 id 一行。
输入输出样例
示例
输入
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
输出
1
3
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
原题链接
日志统计https://www.lanqiao.cn/problems/179/learning/
代码思路
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int D = scanner.nextInt();
int K = scanner.nextInt();
int arrays[][] = new int[N][2];
for (int i = 0; i < arrays.length; i++) {
arrays[i][0] = scanner.nextInt();// 时刻
arrays[i][1] = scanner.nextInt();// 编号
}
// 将arrays数组以编号从小到大并且编号一样按时刻从小到大排序
Arrays.sort(arrays, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] == o2[1]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
}
});
// 将符合题意的编号放入list
ArrayList<Integer> list = new ArrayList<Integer>();
// 防止重复赋值,每个编号只能用一次
boolean bu = false;
// 设定一个中间值
int temp = 0;
for (int i = 0; i + K - 1 < arrays.length; i++) {
if (arrays[i + K - 1][0] - arrays[i][0] < D && arrays[temp][1] == arrays[i + K - 1][1] && !bu) {
list.add(arrays[i][1]);
bu = true;
} else if (arrays[i][1] != arrays[temp][1]) {
temp = i;
i--;
bu = false;
}
}
for (Integer integer : list) {
System.out.println(integer);
}
}
}