单端队列

leetcode中大部分是使用单端队列,一个口进,一个口出
底层使用链表实现
判断数据结构的好坏要对比四个操作

1、访问Access

时间复杂度是O(N),需要遍历才能找到要访问的元素。

2、搜索Search

时间复杂度是O(N)。和访问一样,也是需要遍历才能找到对应的元素。

3、插入Insert

时间复杂度是O(1)。只能在队尾插入元素。

4、删除Delete

时间复杂度为O(1)。只能在队头删除元素。

Java队列常用操作

1、创建队列

Queue<Integer> queue = new LinkedList<>();
Queue是Java中的队列接口,通常使用链表来实现这个接口,因为队列经常要插入删除,链表的插入删除时间复杂度比较小。

2、添加元素

queue.add(1);
queue.add(2);
queue.add(3);
时间复杂度是O(1)。

3、获取元素

int head = queue.peek();
获取队列头元素,即当前最先出队列的元素。时间复杂度是O(1)。

4、删除元素

int head = queue.poll();
删除队列头元素,和上面的获取元素一样,时间复杂度是O(1)。

5、判断队列是否为空

boolean isEmpty = queue.isEmpty();
时间复杂度是O(1),因为实际上是判断队列长度是否为0。

6、获取队列长度

int length = queue.size();
时间复杂度是O(1)。因为在创建队列时就定义了一个变量来记录队列的长度,增删时会随之改变。获取队列长度是直接返回这个变量,不需要遍历队列。

7、遍历队列

while(!queue.isEmpty()) {
 int temp = queue.poll();
 }

8、队列相关leetcode

No.933 最近的请求次数

思路:创建私有变量queue,在构造方法中初始化queue。ping方法中先将当前请求时间加入队列,然后将当前请求时间和3000相减,得到队列中最早的请求时间,即最小值应该是多少。比如当前请求时间是3001,则最早的请求时间应该是1,如果队列中有请求时间比1小的,就删除;当前请求时间是3002,最早请求时间应该是2,如果队列中有请求时间比2小的,就删除。遍历队列,如果当前队列不为空且队列中的头元素小于最小值,就删除头元素。最后返回队列的长度。

class RecentCounter {
    Queue<Integer> queue;

    public RecentCounter() {
        queue = new LinkedList<>();
    }
    
    public int ping(int t) {
        queue.add(t);
        int min = t - 3000;
        while(!queue.isEmpty() && queue.peek() < min) {
            queue.poll();
        }
        return queue.size();
    }
}