题目
代码部分一(119ms 93.15%)
class RecentCounter {
Queue<Integer> queue;
public RecentCounter() {
queue = new LinkedList<>();
}
public int ping(int t) {
queue.add(t);
while(t - queue.peek() > 3000)
queue.poll();
return queue.size();
}
}
-
初始化后,每次调用ping()时
-
先将当前时间 t 加入队列 queue , 判断队头(第一个元素)是否符合范围,不符合则弹出,直到寻找到符合的元素、
-
发挥队列长度(剩下的元素都为符合的 ping)
代码部分二(94ms 99.32%)
class RecentCounter {
int[] index;
int count;
int i;
public RecentCounter() {
index = new int[10000];
count = -1;
i = 0;
}
public int ping(int t) {
count++;
index[count] = t;
for(; i <= count; i++){
if(t - index[i] <= 3000) break;
}
return count - i + 1;
}
}
-
利用快慢指针法
-
创建一个数组用于存储 ping 的时间,创建快指针 count ,慢指针 i
-
每次调用 ping() ,count 记录当前是第几次 ping ,并将 t 存到对于数组内
-
利用 for() 寻找到第一个符合的数组 ,此时 i 为该符合的数组位置
-
返回当前 ping 的序号 - 开始符合的 ping 的序号 +1