队列 滑动窗口

方法一队列

由于数据是严格递增的,创建一个队列,先进的是小的时间,先进去的时间优先出来,这样队列里面保存的就是最近的3000的数据

参考代码

  1. class RecentCounter:
  2. def __init__(self):
  3. self.q = collections.deque()
  4. def ping(self, t: int) -> int:
  5. self.q.append(t)
  6. while t - self.q[0] > 3000:
  7. self.q.popleft()
  8. return len(self.q)
  9. # Your RecentCounter object will be instantiated and called as such:
  10. # obj = RecentCounter()
  11. # param_1 = obj.ping(t)

复杂度分析

时间复杂度 O(1) 遍历找到最近3000个数的操作为最多为3000不会随数据规模扩大而扩大。
空间复杂度 O(m)

方法二滑动窗口

和队列一样,不过滑动窗口不需要把数据出列,控制指针滑动即可

参考代码

  1. class RecentCounter:
  2. def __init__(self):
  3. self.arr = []
  4. self.left = 0
  5. def ping(self, t: int) -> int:
  6. self.arr.append(t)
  7. while t - self.arr[self.left] > 3000:
  8. self.left += 1
  9. return len(self.arr) - self.left
  10. # Your RecentCounter object will be instantiated and called as such:
  11. # obj = RecentCounter()
  12. # param_1 = obj.ping(t)

复杂度分析

时间复杂度 O(1)
空间复杂度 O(n) n为数据规模,即调用次数