933.最近的请求次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class RecentCounter {
private:
queue<int> data;
public:
RecentCounter() {}

int ping(int t) {
data.push(t);
while(data.front() < (t - 3000)){
data.pop();
}
return data.size();
}
};

这道题只要想明白一件事情,即由于题目保证每次对 ping 调用所使用的 t 值都 严格递增,而我们只关心传递进来的 t 在 [t-3000,t] 范围内 ping 的总数,那就表明之前加入的所有数据并不是都有必要一直存在。

简单举例说明:[1], [100], [3001], [3002]

加入元素 范围内所有请求数 容器是否需要移除数据
1 [-2999,1] 不需要,还有元素1
100 [-2900,100] 不需要,还有元素 1、100
3001 [1,3001] 不需要,还有元素 1、100、3001
3002 [2,3002] 需要,移除元素 1,还有元素 100、3001、3002

没错,到加入3002开始,由于后续加入的元素必然大于 3002,那么元素 1 没有存在的必要了,因为它都不在 [2,3002]范围,那么后续加入的元素它也必然不可能满足,因此 pop 掉。

如果这道题没有想到这点,就会容易弄复杂,可能头脑清晰的时候一下子就想出来了,可若不是如此,很容易掉进陷阱中,比方说所有数据都保存,但实际上这是没必要的,因为递增的数据说明前面的数据并不一定有价值,在合适的地方就该删掉。