LeetCode 641 设计循环双端队列[双指针] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 641 设计循环双端队列[双指针] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

解题思路

利用双指针固定队列的头和尾,唯一需要注意的是当队列只有一个元素的时候,这个元素既是头也是尾,无论是插入还是删除都要特殊处理,代码如下:

代码

class MyCircularDeque 
private:
    int len;
    int front, rear, cur;
    vector<int> list;
public:
    MyCircularDeque(int k) 
        len = k;
        front = 0;
        rear = 0;
        cur = 0;
        list = vector<int>(k);
    
    
    bool insertFront(int value) 
        if(cur == len) 
            return false;
        
        if(cur == 0) 
            list[front] = value;
         else 
            front = (front - 1 + len) % len;
            list[front] = value;
        
        cur ++;
        return true;
    
    
    bool insertLast(int value) 
        if(cur == len) 
            return false;
        
        if(cur == 0) 
            list[rear] = value;
         else 
            rear = (rear + 1 + len) % len;
            list[rear] = value;
        
        cur ++;
        return true;
    
    
    bool deleteFront() 
        if(cur == 0) 
            return false;
        
        if(cur > 1) 
            front = (front + 1 + len) % len;
        
        cur --;
        return true;
    
    
    bool deleteLast() 
        if(cur == 0) 
            return false;
        
        if(cur > 1) 
            rear = (rear - 1 + len) % len;
        
        cur --;
        return true;
    
    
    int getFront() 
        if(cur == 0) 
            return -1;
        
        return list[front];
    
    
    int getRear() 
        if(cur == 0) 
            return -1;
                
        return list[rear];
    
    
    bool isEmpty() 
        return cur == 0;
    
    
    bool isFull() 
        return cur == len;
    
;

/**
 * Your MyCircularDeque object will be instantiated and called as such:
 * MyCircularDeque* obj = new MyCircularDeque(k);
 * bool param_1 = obj->insertFront(value);
 * bool param_2 = obj->insertLast(value);
 * bool param_3 = obj->deleteFront();
 * bool param_4 = obj->deleteLast();
 * int param_5 = obj->getFront();
 * int param_6 = obj->getRear();
 * bool param_7 = obj->isEmpty();
 * bool param_8 = obj->isFull();
 */

以上是关于LeetCode 641 设计循环双端队列[双指针] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 641. 设计循环双端队列 / 1656. 设计有序流 / 302. 层数最深叶子节点的和

LeetCode 641. 设计循环双端队列 / 1656. 设计有序流 / 302. 层数最深叶子节点的和

641. 设计循环双端队列

641. 设计循环双端队列

LeetCode 863. 二叉树中所有距离为 K 的结点/ 641. 设计循环双端队列 / 622. 设计循环队列

每日一题641. 设计循环双端队列