[Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: https://www.cnblogs.com/strengthen/p/10479758.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Design your implementation of the circular double-ended queue (deque).
Your implementation should support following operations:
MyCircularDeque(k)
: Constructor, set the size of the deque to be k.insertFront()
: Adds an item at the front of Deque. Return true if the operation is successful.insertLast()
: Adds an item at the rear of Deque. Return true if the operation is successful.deleteFront()
: Deletes an item from the front of Deque. Return true if the operation is successful.deleteLast()
: Deletes an item from the rear of Deque. Return true if the operation is successful.getFront()
: Gets the front item from the Deque. If the deque is empty, return -1.getRear()
: Gets the last item from Deque. If the deque is empty, return -1.isEmpty()
: Checks whether Deque is empty or not.isFull()
: Checks whether Deque is full or not.
Example:
MyCircularDeque circularDeque = new MycircularDeque(3); // set the size to be 3 circularDeque.insertLast(1); // return true circularDeque.insertLast(2); // return true circularDeque.insertFront(3); // return true circularDeque.insertFront(4); // return false, the queue is full circularDeque.getRear(); // return 2 circularDeque.isFull(); // return true circularDeque.deleteLast(); // return true circularDeque.insertFront(4); // return true circularDeque.getFront(); // return 4
Note:
- All values will be in the range of [0, 1000].
- The number of operations will be in the range of [1, 1000].
- Please do not use the built-in Deque library.
设计实现双端队列。
你的实现需要支持以下操作:
- MyCircularDeque(k):构造函数,双端队列的大小为k。
- insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
- insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
- deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
- deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
- getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
- getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
- isEmpty():检查双端队列是否为空。
- isFull():检查双端队列是否满了。
示例:
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, 1000]
- 操作次数的范围为 [1, 1000]
- 请不要使用内置的双端队列库。
Runtime: 136 ms
Memory Usage: 20.5 MB
1 class MyCircularDeque { 2 var data:[Int] 3 var size:Int 4 5 /** Initialize your data structure here. Set the size of the deque to be k. */ 6 init(_ k: Int) { 7 data = [Int]() 8 size = k 9 } 10 11 /** Adds an item at the front of Deque. Return true if the operation is successful. */ 12 func insertFront(_ value: Int) -> Bool { 13 if isFull() {return false} 14 data.insert(value,at:0) 15 return true 16 } 17 18 /** Adds an item at the rear of Deque. Return true if the operation is successful. */ 19 func insertLast(_ value: Int) -> Bool { 20 if isFull() {return false} 21 data.append(value) 22 return true 23 } 24 25 /** Deletes an item from the front of Deque. Return true if the operation is successful. */ 26 func deleteFront() -> Bool { 27 if isEmpty() {return false} 28 data.removeFirst() 29 return true 30 } 31 32 /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ 33 func deleteLast() -> Bool { 34 if isEmpty() {return false} 35 data.popLast() 36 return true 37 } 38 39 /** Get the front item from the deque. */ 40 func getFront() -> Int { 41 if isEmpty() {return -1} 42 return data.first! 43 44 } 45 46 /** Get the last item from the deque. */ 47 func getRear() -> Int { 48 if isEmpty() {return -1} 49 return data.last! 50 } 51 52 /** Checks whether the circular deque is empty or not. */ 53 func isEmpty() -> Bool { 54 return data.isEmpty 55 } 56 57 /** Checks whether the circular deque is full or not. */ 58 func isFull() -> Bool { 59 return data.count >= size 60 } 61 } 62 63 /** 64 * Your MyCircularDeque object will be instantiated and called as such: 65 * let obj = MyCircularDeque(k) 66 * let ret_1: Bool = obj.insertFront(value) 67 * let ret_2: Bool = obj.insertLast(value) 68 * let ret_3: Bool = obj.deleteFront() 69 * let ret_4: Bool = obj.deleteLast() 70 * let ret_5: Int = obj.getFront() 71 * let ret_6: Int = obj.getRear() 72 * let ret_7: Bool = obj.isEmpty() 73 * let ret_8: Bool = obj.isFull() 74 */
156ms
1 class MyCircularDeque: CustomStringConvertible { 2 3 var capacity: Int { 4 return deque.count 5 } 6 7 var description: String { 8 return deque.description 9 } 10 11 private var deque: [Int] 12 13 private var frontIndex: Int? 14 private var rearIndex: Int? 15 16 /** Initialize your data structure here. Set the size of the deque to be k. */ 17 init(_ k: Int) { 18 self.deque = [Int].init(repeating: 0, count: k) 19 } 20 21 /** Adds an item at the front of Deque. Return true if the operation is successful. */ 22 func insertFront(_ value: Int) -> Bool { 23 guard isFull() == false else { 24 return false 25 } 26 27 if var front = self.frontIndex { 28 front = shiftBackwards(front) 29 self.frontIndex = front 30 deque[front] = value 31 32 } else { 33 self.frontIndex = 0 34 self.rearIndex = 0 35 deque[0] = value 36 } 37 38 return true 39 } 40 41 /** Adds an item at the rear of Deque. Return true if the operation is successful. */ 42 func insertLast(_ value: Int) -> Bool { 43 guard isFull() == false else { 44 return false 45 } 46 47 if var rear = self.rearIndex { 48 rear = shiftForwards(rear) 49 self.rearIndex = rear 50 deque[rear] = value 51 52 } else { 53 self.frontIndex = 0 54 self.rearIndex = 0 55 deque[0] = value 56 } 57 58 return true 59 } 60 61 /** Deletes an item from the front of Deque. Return true if the operation is successful. */ 62 func deleteFront() -> Bool { 63 guard isEmpty() == false else { 64 return false 65 } 66 67 guard let front = self.frontIndex else { 68 fatalError("front must be valid in a non empty deque") 69 } 70 71 if front == self.rearIndex { 72 self.frontIndex = nil 73 self.rearIndex = nil 74 } else { 75 self.frontIndex = shiftForwards(front) 76 } 77 78 return true 79 } 80 81 /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ 82 func deleteLast() -> Bool { 83 guard isEmpty() == false else { 84 return false 85 } 86 87 guard let rear = self.rearIndex else { 88 fatalError("rear must be valid in a non empty deque") 89 } 90 91 if rear == self.frontIndex { 92 self.frontIndex = nil 93 self.rearIndex = nil 94 } else { 95 self.rearIndex = shiftBackwards(rear) 96 } 97 98 return true 99 } 100 101 /** Get the front item from the deque. */ 102 func getFront() -> Int { 103 guard let front = self.frontIndex else { 104 return -1 105 } 106 107 return self.deque[front] 108 } 109 110 /** Get the last item from the deque. */ 111 func getRear() -> Int { 112 guard let rear = self.rearIndex else { 113 return -1 114 } 115 116 return self.deque[rear] 117 } 118 119 /** Checks whether the circular deque is empty or not. */ 120 func isEmpty() -> Bool { 121 return self.frontIndex == nil && self.rearIndex == nil 122 } 123 124 /** Checks whether the circular deque is full or not. */ 125 func isFull() -> Bool { 126 if let front = self.frontIndex, let rear = self.rearIndex { 127 128 if rear < front, front == shiftForwards(rear) { 129 return true 130 } 131 132 if rear > front, front == 0, rear == self.capacity - 1 { 133 return true 134 } 135 } 136 137 return false 138 } 139 140 private func shiftForwards(_ i: Int) -> Int { 141 var index = i + 1 142 if index == capacity { 143 index = 0 144 } 145 146 return index 147 } 148 149 private func shiftBackwards(_ i: Int) -> Int { 150 var index = i - 1 151 if index == -1 { 152 index = capacity - 1 153 } 154 155 return index 156 } 157 }
160ms
1 class MyCircularDeque { 2 private class Node { 3 public var prev: Node? 4 public var next: Node? 5 public var val: Int 6 7 init(_ val: Int) { 8 self.val = val 9 } 10 } 11 12 private var head: Node? 13 private var tail: Node? 14 private var maxSize: Int 15 private var size: Int 16 17 /** Initialize your data structure here. Set the size of the deque to be k. */ 18 init(_ k: Int) { 19 self.maxSize = k 20 self.size = 0 21 } 22 23 /** Adds an item at the front of Deque. Return true if the operation is successful. */ 24 func insertFront(_ value: Int) -> Bool { 25 guard self.size < self.maxSize else { 26 return false 27 } 28 29 let node = Node(value) 30 node.prev = self.head 31 self.head?.next = node 32 self.head = node 33 if size == 0 { 34 self.tail = node 35 } 36 self.size += 1 37 38 return true 39 } 40 41 /** Adds an item at the rear of Deque. Return true if the operation is successful. */ 42 func insertLast(_ value: Int) -> Bool { 43 guard self.size < self.maxSize else { 44 return false 45 } 46 47 let node = Node(value) 48 node.next = self.tail 49 self.tail?.prev = node 50 self.tail = node 51 if size == 0 { 52 self.head = node 53 } 54 self.size += 1 55 56 return true 57 } 58 59 /** Deletes an item from the front of Deque. Return true if the operation is successful. */ 60 func deleteFront() -> Bool { 61 guard self.size > 0 else { 62 return false 63 } 64 65 self.head = self.head?.prev 66 self.head?.next = nil 67 self.size -= 1 68 if self.size == 0 { 69 self.head = nil 70 self.tail = nil 71 } 72 73 return true 74 } 75 76 /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ 77 func deleteLast() -> Bool { 78 guard self.size > 0 else { 79 return false 80 } 81 82 self.tail = self.tail?.next 83 self.tail?.prev = nil 84 self.size -= 1 85 if self.size == 0 { 86 self.head = nil 87 self.tail = nil 88 } 89 90 return true 91 92 } 93 94 /** Get the front item from the deque. */ 95 func getFront() -> Int { 96 return self.head?.val ?? -1 97 } 98 99 /** Get the last item from the deque. */ 100 func getRear() -> Int { 101 return self.tail?.val ?? -1 102 } 103 104 /** Checks whether the circular deque is empty or not. */ 105 func isEmpty() -> Bool { 106 return self.size == 0 107 } 108 109 /** Checks whether the circular deque is full or not. */ 110 func isFull() -> Bool { 111 return self.size == self.maxSize 112 } 113 114 func getList() -> [Int] { 115 var l: [Int] = [] 116 117 var node = self.head 118 while node != nil { 119 l.append(node!.val) 120 node = node!.prev 121 } 122 123 return l 124 } 125 }
196ms
1 class MyCircularDeque { 2 3 private var array = [Int]() 4 private var maxSize = 0 5 /** Initialize your data structure here. Set the size of the deque to be k. */ 6 init(_ k: Int) { 7 maxSize = k 8 } 9 10 /** Adds an item at the front of Deque. Return true if the operation is successful. */ 11 func insertFront(_ value: Int) -> Bool { 12 guard array.count < maxSize else { 13 return false 14 } 15 16 array.insert(value, at: 0) 17 return true 18 } 19 20 /** Adds an item at the rear of Deque. Return true if the operation is successful. */ 21 func insertLast(_ value: Int) -> Bool { 22 guard array.count < maxSize else { 23 return false 24 } 25 array.append(value) 26 return true 27 } 28 29 /** Deletes an item from the front of Deque. Return true if the operation is successful. */ 30 func deleteFront() -> Bool { 31 guard array.count >= 1 else { 32 return false 33 } 34 35 array.remove(at: 0) 36 return true 37 } 38 39 /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ 40 func deleteLast() -> Bool { 41 guard array.count >= 1 else { 42 return false 43 } 44 45 array.removeLast() 46 return true 47 } 48 49 /** Get the front item from the deque. */ 50 func getFront() -> Int { 51 guard let first = array.first else { 52 return -1 53 } 54 55 return first 56 } 57 58 /** Get the last item from the deque. */ 59 func getRear() -> Int { 60 guard let last = array.last else { 61 return -1 62 } 63 64 return last 65 } 66 67 /** Checks whether the circular deque is empty or not. */ 68 func isEmpty() -> Bool { 69 return array.count == 0 70 } 71 72 /** Checks whether the circular deque is full or not. */ 73 func isFull() -> Bool { 74 return array.count == maxSize 75 } 76 }
264ms
1 class MyCircularDeque { 2 3 var length = 0 4 var array:[Int] = [] 5 6 /** Initialize your data structure here. Set the size of the deque to be k. */ 7 init(_ k: Int) { 8 length = k 9 } 10 11 /** Adds an item at the front of Deque. Return true if the operation is successful. */ 12 func insertFront(_ value: Int) -> Bool { 13 if array.count < length { 14 array.insert(value, at: 0) 15 return true 16 }else{ 17 return false 18 } 19 } 20 21 /** Adds an item at the rear of Deque. Return true if the operation is successful. */ 22 func insertLast(_ value: Int) -> Bool { 23 if array.count < length { 24 array.append(value) 25 return true 26 }else{ 27 return false 28 } 29 } 30 31 /** Deletes an item from the front of Deque. Return true if the operation is successful. */ 32 func deleteFront() -> Bool { 33 if array.count > 0 { 34 array.removeFirst() 35 return true 36 }else{ 37 return false 38 } 39 } 40 41 /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ 42 func deleteLast() -> Bool { 43 if array.count > 0 { 44 array.removeLast() 45 return true 46 }else{ 47 return false 48 } 49 } 50 51 /** Get the front item from the deque. */ 52 func getFront() -> Int { 53 if array.count == 0 { 54 return -1 55 }else{ 56 return array.first! 57 } 58 } 59 60 /** Get the last item from the deque. */ 61 func getRear() -> Int { 62 if array.count == 0 { 63 return -1 64 }else{ 65 return array.last! 66 } 67 } 68 69 /** Checks whether the circular deque is empty or not. */ 70 func isEmpty() -> Bool { 71 return array.count == 0 72 } 73 74 /** Checks whether the circular deque is full or not. */ 75 func isFull() -> Bool { 76 return array.count == length 77 } 78 }