左神算法笔记-循环双端队列

56 阅读1分钟

leetcode.cn/problems/de…

重点解析

image.png

代码实现

/**
 * 两种情况:
 * 1.1 头入:l = l == 0 ? (limit - 1) : (l - 1);
 * 1.2 头出:l = l == (limit - 1) ? 0 : (l + 1);
 * <p>
 * 2.1 尾入:r = r == (limit - 1) ? 0 : (r + 1);
 * 2.2 尾出:r = r == 0 ? (limit - 1) : (r - 1);
 */
class MyCircularDeque {
    // 固定数组
    int[] deque;
    // size:队列长度,limit:双端队列允许存在的最大数量
    // l:队列头部,r:队列尾部
    int size, limit, l, r;

    public MyCircularDeque(int k) {
        deque = new int[k];
        limit = k;
        l = r = size = 0;
    }

    public boolean insertFront(int value) {
        if (isFull()) {
            return false;
        }
        if (isEmpty()) {
            l = r = 0;
            deque[0] = value;
        } else {
            l = l == 0 ? (limit - 1) : (l - 1);
            deque[l] = value;
        }
        size++;
        return true;
    }

    public boolean insertLast(int value) {
        if (isFull()) {
            return false;
        }
        if (isEmpty()) {
            l = r = 0;
            deque[0] = value;
        } else {
            r = r == (limit - 1) ? 0 : (r + 1);
            deque[r] = value;
        }
        size++;
        return true;
    }

    public boolean deleteFront() {
        if (isEmpty()) {
            return false;
        }
        l = l == (limit - 1) ? 0 : (l + 1);
        size--;
        return true;
    }

    public boolean deleteLast() {
        if (isEmpty()) {
            return false;
        }
        r = r == 0 ? (limit - 1) : (r - 1);
        size--;
        return true;
    }

    public int getFront() {
        return isEmpty() ? -1 : deque[l];
    }

    public int getRear() {
        return isEmpty() ? -1 : deque[r];
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean isFull() {
        return size == limit;
    }
}