题目链接:
力扣https://leetcode-cn.com/problems/number-of-recent-calls/
【方法一 二分查找】看到严格递增DNA就动了,只要记录之前记录的请求时间,二分查找>=t-3000的最小值,即lowerBound的right即可。
class RecentCounter {
int[] arr = new int[10001];
int n = 0;
public RecentCounter() {
}
public int binarySearch(int left, int right, int target){
int mid;
// lowerBound
while(left <= right){
mid = (left + right) >>> 1;
if(target <= arr[mid]) right = mid - 1;
else left = mid + 1;
}
return left;
}
public int ping(int t) {
arr[n++] = t;
return n - binarySearch(0, n - 1, t - 3000);
}
}
【方法二 队列】每次来新请求的时候把<t-3000的队头弹出去即可
class RecentCounter {
Deque<Integer> queue = new LinkedList();
public RecentCounter() {
}
public int ping(int t) {
int left = t - 3000;
while(!queue.isEmpty() && queue.peek() < left) queue.poll();
queue.offer(t);
return queue.size();
}
}