KK's blog

每天积累多一些

0%

LeetCode 622 Design Circular Queue

LeetCode

<div>

Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle, and the last position is connected back to the first position to make a circle. It is also called "Ring Buffer".

One of the benefits of the circular queue is that we can make use of the spaces in front of the queue. In a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. But using the circular queue, we can use the space to store new values.

Implement the MyCircularQueue class:

  • MyCircularQueue(k) Initializes the object with the size of the queue to be k.
  • int Front() Gets the front item from the queue. If the queue is empty, return -1.
  • int Rear() Gets the last item from the queue. If the queue is empty, return -1.
  • boolean enQueue(int value) Inserts an element into the circular queue. Return true if the operation is successful.
  • boolean deQueue() Deletes an element from the circular queue. Return true if the operation is successful.
  • boolean isEmpty() Checks whether the circular queue is empty or not.
  • boolean isFull() Checks whether the circular queue is full or not.

You must solve the problem without using the built-in queue data structure in your programming language.

Example 1:

<pre>Input ["MyCircularQueue", "enQueue", "enQueue", "enQueue", "enQueue", "Rear", "isFull", "deQueue", "enQueue", "Rear"] [[3], [1], [2], [3], [4], [], [], [], [4], []] Output [null, true, true, true, false, 3, true, true, true, 4]

Explanation MyCircularQueue myCircularQueue = new MyCircularQueue(3); myCircularQueue.enQueue(1); // return True myCircularQueue.enQueue(2); // return True myCircularQueue.enQueue(3); // return True myCircularQueue.enQueue(4); // return False myCircularQueue.Rear(); // return 3 myCircularQueue.isFull(); // return True myCircularQueue.deQueue(); // return True myCircularQueue.enQueue(4); // return True myCircularQueue.Rear(); // return 4 </pre>

Constraints:

  • 1 <= k <= 1000
  • 0 <= value <= 1000
  • At most 3000 calls will be made to enQueue, deQueueFrontRearisEmpty, and isFull.

</div>

题目大意:

实现循环队列

解题思路Array(推荐):

用两个指针为维持数据的开始和结束+1,由于循环队列,所以用mod来找到数组下标,也就是start和end一样时候,既可能是empty也可能是full,所以加一个变量记录

解题步骤:

用count就可以省去end和is_full两个变量
如果要实现同步队列,就引入self.queueLock = Lock(), with self.queueLock: 就进行enQueue操作

注意事项:

N/A

Python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class MyCircularQueue:

def __init__(self, k: int):
self.data = [0] * k
self.start = 0 # starting point of data
self.end = 0 # ending point + 1 of data
self.size = k
self.is_full = False

def enQueue(self, value: int) -> bool:
if self.isFull():
return False
self.data[self.end] = value
self.end = (self.end + 1) % self.size
if self.start == self.end:
self.is_full = True
return True

def deQueue(self) -> bool:
if self.isEmpty():
return False
self.start = (self.start + 1) % self.size
self.is_full = False
return True

def Front(self) -> int:
if self.isEmpty():
return -1
return self.data[self.start]

def Rear(self) -> int:
if self.isEmpty():
return -1
return self.data[(self.end - 1) % self.size]

def isEmpty(self) -> bool:
return not self.is_full and self.start == self.end

def isFull(self) -> bool:
return self.is_full

算法分析:

时间复杂度为O(1),空间复杂度O(n)

算法II解题思路Linked List:

比较简单,省略

算法分析:

时间复杂度为O(1),空间复杂度O(n)

Free mock interview