leetcode933题.最近的请求次数
作者:互联网
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
请你实现 RecentCounter 类:
RecentCounter() 初始化计数器,请求数为 0 。
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
保证 每次对 ping 的调用都使用比之前更大的 t 值。
//实例一 输入: ["RecentCounter", "ping", "ping", "ping", "ping"] [[], [1], [100], [3001], [3002]] 输出: [null, 1, 2, 3, 3] 解释: RecentCounter recentCounter = new RecentCounter(); recentCounter.ping(1); // requests = [1],范围是 [-2999,1],返回 1 recentCounter.ping(100); // requests = [1, 100],范围是 [-2900,100],返回 2 recentCounter.ping(3001); // requests = [1, 100, 3001],范围是 [1,3001],返回 3 recentCounter.ping(3002); // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3
首先先复习一下二分法
public class Solution{ static int binarySearch(int[]arr,int item){ int index=-1; int low=0,high=arr.length-1; while(low<=high){ int mid=(low+high)/2; if(arr[mid]==item) return mid; else if(arr[mid]<item) low=mid+1; else high=mid-1; } return index; } }
方法一:使用队列
class RecentCounter {
//利用队列先进先出的特性,对最先插入队列的元素进行操作 Queue<Integer> queue; public RecentCounter() { queue=new ArrayDeque<>(); } public int ping(int t) { queue.offer(t); while(queque.peek()+3000<t){ queue.poll(); } return queue.size(); } }
方法二:滑动窗口
class RecentCounter { int[]arr; int tail,head; public RecentCounter() { arr=new int[10240]; tail=head=0; } public int ping(int t) { arr[tail++]=t; while(tail>head&&arr[head]+3000<t){ head++; } return tail-head; } }
方法三:二分法查找法
class RecentCounter { List<Integer>list; public RecentCounter() { list=new ArrayList<>(); } public int ping(int t) { list.add(t); if(t<=3000) return list.size(); else{ int idx=findIndex(list,t-3000); return l } } int findIndex(List<Integer>list,int item){ int left=0,right=list.size()-1; while(left<=right){ int mid=(left+right)>>1; if(list.get(mid)==item) return mid; else if(list.get(mid)>item) right=mid-1; else left=mid+1; } return left; } }
标签:arr,请求,int,ping,次数,RecentCounter,100,leetcode933,public 来源: https://www.cnblogs.com/luorongxin/p/16229315.html