leetcode:641. 设计循环双端队列
生活随笔
收集整理的這篇文章主要介紹了
leetcode:641. 设计循环双端队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
641. 設計循環雙端隊列
來源:力扣(LeetCode)
鏈接: https://leetcode.cn/problems/design-circular-deque/
設計實現雙端隊列。
實現 MyCircularDeque 類:
- MyCircularDeque(int k) :構造函數,雙端隊列最大為 k 。
- boolean insertFront():將一個元素添加到雙端隊列頭部。 如果操作成功返回 true ,否則返回 false 。
- boolean insertLast() :將一個元素添加到雙端隊列尾部。如果操作成功返回 true ,否則返回 false 。
- boolean deleteFront() :從雙端隊列頭部刪除一個元素。 如果操作成功返回 true ,否則返回 false 。
- boolean deleteLast() :從雙端隊列尾部刪除一個元素。如果操作成功返回 true ,否則返回 false 。
- int getFront():從雙端隊列頭部獲得一個元素。如果雙端隊列為空,返回 -1 。
- int getRear() :獲得雙端隊列的最后一個元素。 如果雙端隊列為空,返回 -1 。
- boolean isEmpty() :若雙端隊列為空,則返回 true ,否則返回 false 。
- boolean isFull() :若雙端隊列滿了,則返回 true ,否則返回 false 。
示例 1:
輸入 ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"] [[3], [1], [2], [3], [4], [], [], [], [4], []] 輸出 [null, true, true, true, false, 2, true, true, true, 4]解釋 MyCircularDeque circularDeque = new MycircularDeque(3); // 設置容量大小為3 circularDeque.insertLast(1); // 返回 true circularDeque.insertLast(2); // 返回 true circularDeque.insertFront(3); // 返回 true circularDeque.insertFront(4); // 已經滿了,返回 false circularDeque.getRear(); // 返回 2 circularDeque.isFull(); // 返回 true circularDeque.deleteLast(); // 返回 true circularDeque.insertFront(4); // 返回 true circularDeque.getFront(); // 返回 4提示:
1 <= k <= 1000 0 <= value <= 1000 insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull 調用次數不大于 2000 次解法
- 列表實現:列表實現雙端循環隊列,加front表示起點,rear表示最后元素的下一個節點,用于判斷是否滿了
- 雙鏈表:front和rear表示起始的頭尾節點,無意義;
代碼實現
列表實現
使用列表自帶的性質;
python實現
使用front rear雙指針,并將容量擴從為k+1
class MyCircularDeque:def __init__(self, k: int):self.deque = [0] * (k+1)self.capacity = k+1self.front = 0self.rear = 0def insertFront(self, value: int) -> bool:if self.isFull():return Falseself.front -= 1self.front += self.capacityself.front %= self.capacityself.deque[self.front] = valuereturn Truedef insertLast(self, value: int) -> bool:if self.isFull():return Falseself.deque[self.rear] = valueself.rear += 1self.rear += self.capacityself.rear %= self.capacityreturn Truedef deleteFront(self) -> bool:if self.isEmpty():return Falseself.front += 1self.front += self.capacityself.front %= self.capacityreturn Truedef deleteLast(self) -> bool:if self.isEmpty():return Falseself.rear -= 1self.rear += self.capacityself.rear %= self.capacityreturn Truedef getFront(self) -> int:return self.deque[self.front] if not self.isEmpty() else -1def getRear(self) -> int:return self.deque[(self.rear-1+self.capacity)%self.capacity] if not self.isEmpty() else -1def isEmpty(self) -> bool:return self.front == self.reardef isFull(self) -> bool:return (self.rear+1) % self.capacity == self.front# Your MyCircularDeque object will be instantiated and called as such: # obj = MyCircularDeque(k) # param_1 = obj.insertFront(value) # param_2 = obj.insertLast(value) # param_3 = obj.deleteFront() # param_4 = obj.deleteLast() # param_5 = obj.getFront() # param_6 = obj.getRear() # param_7 = obj.isEmpty() # param_8 = obj.isFull()c++實現
class MyCircularDeque { private:int front = 0;int rear = 0;int capacity = 0;vector<int> deque;// 用整型front作為數組的下標,指向隊列的前端;用整型rear作為數組的下標,指向隊列的尾部+1的位置,即下一個插入的位置public:MyCircularDeque(int k) {capacity = k+1;deque = vector<int>(k+1, 0);}bool insertFront(int value) {if (isFull()) return false;front--;front += capacity;front %= capacity;deque[front] = value;return true;}bool insertLast(int value) {if (isFull())return false;deque[rear] = value;rear++;rear %= capacity;return true;}bool deleteFront() {if (isEmpty())return false;front++;front %= capacity;return true;}bool deleteLast() {if (isEmpty())return false;rear--;rear += capacity;rear %= capacity;return true;}int getFront() {if (isEmpty())return -1;return deque[front];}int getRear() {if (isEmpty())return -1;return deque[(rear-1+capacity)%capacity];}bool isEmpty() {return front == rear;}bool isFull() {return (rear+1) % capacity == front;} };/*** 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();*/復雜度分析
- 時間復雜度: O(1)O(1)O(1)
- 空間復雜度: O(K)O(K)O(K)
雙鏈表
python實現
class Node:def __init__(self, val=-1, prev_node=None, next_node=None):self.val = valself.prev = prev_nodeself.next = next_nodeclass MyCircularDeque(Node):def __init__(self, k: int):self.size = 0self.capacity = kself.front = Node(-1)self.rear = Node(-1)self.front.next = self.rearself.rear.prev = self.front # 雙鏈表def insertFront(self, value: int) -> bool:if self.isFull():return Falsev_node = Node(value)next_node = self.front.nextself.front.next = v_nodev_node.next = next_nodev_node.prev = self.frontnext_node.prev = v_nodeself.size += 1return Truedef insertLast(self, value: int) -> bool:if self.isFull():return Falsev_node = Node(value)prev_node = self.rear.prevv_node.prev = prev_nodeprev_node.next = v_nodev_node.next = self.rearself.rear.prev = v_nodeself.size += 1return Truedef deleteFront(self) -> bool:if self.isEmpty():return Falsev_node = self.front.nextself.front.next = v_node.nextself.front.next.prev = self.frontself.size -= 1return Truedef deleteLast(self) -> bool:if self.isEmpty():return Falsev_node = self.rear.prevself.rear.prev = v_node.prevself.rear.prev.next = self.rearself.size -= 1return Truedef getFront(self) -> int:return self.front.next.valdef getRear(self) -> int:return self.rear.prev.valdef isEmpty(self) -> bool:return self.size == 0def isFull(self) -> bool:return self.size == self.capacity# Your MyCircularDeque object will be instantiated and called as such: # obj = MyCircularDeque(k) # param_1 = obj.insertFront(value) # param_2 = obj.insertLast(value) # param_3 = obj.deleteFront() # param_4 = obj.deleteLast() # param_5 = obj.getFront() # param_6 = obj.getRear() # param_7 = obj.isEmpty() # param_8 = obj.isFull()c++實現
class Node { public:Node* next;Node* prev;int val;Node(int val) {this->val = val;} };class MyCircularDeque { public:int capacity = 0;int size = 0;Node* front = new Node(-1);Node* rear = new Node(-1);MyCircularDeque(int k) {capacity = k;front->next = rear;rear->prev = front;}bool insertFront(int value) {if (isFull())return false;Node* n = new Node(value);Node* next = front->next;front->next = n;n->next = next;next->prev = n;n->prev = front;size++;return true;}bool insertLast(int value) {if (isFull())return false;Node* n = new Node(value);Node* prev = rear->prev;prev->next = n;n->prev = prev;n->next = rear;rear->prev = n;size++;return true;}bool deleteFront() {if (isEmpty())return false;Node* next = front->next;front->next = next->next;next->next->prev = front;size--;delete next;return true;}bool deleteLast() {if (isEmpty())return false;Node* prev = rear->prev;rear->prev = prev->prev;prev->prev->next = rear;size--;delete prev;return true;}int getFront() {return front->next->val;}int getRear() {return rear->prev->val;}bool isEmpty() {return size == 0;}bool isFull() {return size == capacity;} };/*** 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();*/復雜度分析
- 時間復雜度: O(1)O(1)O(1)
- 空間復雜度: O(1)O(1)O(1)
總結
以上是生活随笔為你收集整理的leetcode:641. 设计循环双端队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark执行流程与原理
- 下一篇: U盘文件或目录损坏且无法读取的修复/解决