版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011732358/article/details/83833428
题目:依次输入数据,每次输入一个数t后,返回其之前所输入的数据在[t-3000,t]区间内的个数, 保证每次输入的数据都比上次大。
思路:用个list来记录,如果第一个数输入进来,直接返回1
然后每次输入进来数后,看看第一个数在不在该区间内,如果在,把该数加到list中,直接返回list大小。如果第一个数不在区间内,然后就用二分查找,找到最接近t-3000数的位置,然后用list大小减去该位置即可。
别人思路:借助 队列 Queue 或者 Deque 数据结构来完成此题目。在每次调用 ping() 方法时,我们便从队列头部开始遍历,判断头部元素是否小于 (当前值t - 3000),如果是,则删除该头部元素。最后,将 t 添加到队列中。
class RecentCounter {
List<Integer> list = new ArrayList<Integer>() ;
public RecentCounter() {
}
public int ping(int t) {
if(list.size() == 0){
list.add(t) ;
return list.size() ;
}
if(list.get(0)+3000>=t){
list.add(t) ;
return list.size() ;
}else {
int left = 1 ;
int right = list.size()-1 ;
int mid ;
while(left<=right){
mid = (left+right)/2 ;
if(list.get(mid)+3000>t){
right = mid - 1 ;
}else if(list.get(mid)+3000<t){
left = mid +1 ;
}else{
list.add(t) ;
return (list.size() - mid) ;
}
}
list.add(t) ;
return (list.size() - right-1) ;
}
}
}
/**
* Your RecentCounter object will be instantiated and called as such:
* RecentCounter obj = new RecentCounter();
* int param_1 = obj.ping(t);
*/
class RecentCounter {
Queue<Integer> res;
public RecentCounter() {
res = new LinkedList<>();
}
public int ping(int t) {
while(!res.isEmpty() && res.peek() < t - 3000){
res.remove();
}
res.offer(t);
return res.size();
}
}