感觉这个题目很具有琢磨性 和外卖的订单的那个题目的划分思想类似
但是算法不同
题目描述
如果存在某个时刻 T满足该帖在 [T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K个赞,该帖就曾是”热帖”。
给定日志,请你帮助小明统计出所有曾是”热帖”的帖子编号。
样例
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
输出
1
3
*在java中创建一个新的类,用来一次性存储两个数,相当于c++里面的pair数组
在新创建的类中需要重构一个排序方法,使用comparable接口实现compareTo方法*
this.x -p.x>0?1:-1 从小到大进行排序
代码
class Pair implements Comparable<Pair>{
int x;
int y;
public Pair(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int compareTo(Pair p) {
// TODO Auto-generated method stub
return this.x - p.x>0? 1:-1;
//从小到大的顺序
}
}
在使用这个类的时候,定义成这个类的数组,然后在添加新元素的时候,需要先新创建一个对象,把新创建的pair对象赋值给pair类型的数组
排序完成之后,就是依次的判断了
采用双指针的算法对i在前面跑,j在后面跟,这里的ij都是表示的是下标,总共需要循环n次。
这里不需要将时间从t0时刻一直无间隔的循环到1e5,而是直接对这个pair数组的时刻进行循环就行
判断指针ij的时刻
起初ij指针重合,时间是一定小于d的,此时i向前走,j不动。每移动一次i,就会有一个某时刻的id获得赞,给id加上一个赞
同时还需要使用一个while循环判断ij指针之间的时间差,当时间大于等于d的时候,就代表超过界限了,需要减去j所在的id的赞,同时j向前移动直到时间间隔小于d的时候
package twopointer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
class Pair implements Comparable<Pair>{
int x;
int y;
public Pair(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int compareTo(Pair p) {
// TODO Auto-generated method stub
return this.x - p.x>0? 1:-1;
//从小到大的顺序
}
}
public class 日志统计 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String p[]=bufferedReader.readLine().split(" ");
int n=Integer.parseInt(p[0]);
int d=Integer.parseInt(p[1]);
int k=Integer.parseInt(p[2]);
int N=(int) 1e5+10;
boolean st[]=new boolean [N];
int cnt[]=new int [N];
Pair a[]=new Pair[n];
for(int i=0;i<n;i++){
p=bufferedReader.readLine().split(" ");
int ts=Integer.parseInt(p[0]);
int id=Integer.parseInt(p[1]);
a[i]=new Pair(ts, id);
}
Arrays.sort(a);
//双指针算法
int j=0;
//j在前,i在后
for(int i=0;i<n;i++){
int id = a[i].y;
cnt[id]++;
while(a[i].x-a[j].x >=d){
cnt[a[j].y]--;
j++;
}
if(cnt[id] >=k) st[id]=true;
}
for(int i=0;i<N;i++){
if(st[i]){
System.out.println(i);
}
}
}
}