#1238. 日志统计(acwing)
小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 NN 行。
其中每一行的格式是:
ts id
表示在 ts 时刻编号 id 的帖子收到一个”赞”。
现在小明想统计有哪些帖子曾经是”热帖”。
如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。
具体来说,如果存在某个时刻 T满足该帖在 [T,T+D)[T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 KK 个赞,该帖就曾是”热帖”。
给定日志,请你帮助小明统计出所有曾是”热帖”的帖子编号。
输入格式
第一行包含三个整数 N,D,K。
以下 N 行每行一条日志,包含两个整数 ts 和 id。
输出格式
按从小到大的顺序输出热帖 id。
每个 id 占一行。
数据范围
1≤K≤N≤105
0≤ts,id≤105
1≤D≤10000
输入样例:
7 10
2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
输出样例:1 3
解题思路:
滑动窗口。
通过自检一个Log类继承Comparable接口,将所有记录用时间从小到大排序。
初始化两个数组,list存储当前的点赞数,ans存储满足点赞要求的id号。
滑动窗口的意义就是滑动时后面不符合要求的数要删除,因此添加判断if(log[i].time-log[j].time >= D)时最后面list[log[j].id]--;
import java.util.*; class Log implements Comparable<Log>{ public int time; public int id; public Log(int time,int id){ this.time = time; this.id = id; } public int compareTo(Log o){ return this.time - o.time; } } class Main{ public static void main(String str[]){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int D = sc.nextInt(); int K = sc.nextInt(); Log[] log = new Log[100010]; int list[] = new int[100010]; boolean ans[] = new boolean[100010]; for(int i = 0;i < N;i++){ log[i] = new Log(sc.nextInt(),sc.nextInt()); } Arrays.sort(log,0,N); for(int i = 0,j = 0;i < N;i++){ list[log[i].id]++; while(log[i].time - log[j].time >= D){ //用while不用if是保证当前i与j之间时间差为D内 list[log[j].id]--; j++; } if(list[log[i].id]>=K)ans[log[i].id]=true; } for(int i = 0;i < 100010;i++){ if(ans[i])System.out.println(i); } } }
知识点:
自定义类排序条件先继承Comparable接口,并重载compareTo函数;
若是不用类则新建一个Comparator类:(这里是新建对象Comparator!!函数也不一样是compare!!!)
Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } });
本文作者:Canyooo
本文链接:https://www.cnblogs.com/canyooo/p/15929845.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步