59. II. 队列的最大值
需要实现的不是队列,而是提取队列最大值这个功能。所以直接用queue包来实现queue。用一个队列queue来存放数据(只能先进先出),用双端队列保存最大值。
import queue
class MaxQueue:
def __init__(self):
self.deque = queue.deque()
self.queue = queue.Queue()
def max_value(self) -> int:
return self.deque[0] if self.deque else -1
def push_back(self, value: int) -> None:
while self.deque and self.deque[-1] < value:
self.deque.pop()
self.deque.append(value)
self.queue.put(value)
def pop_front(self) -> int:
if not self.deque:
return -1
ans = self.queue.get()
if ans == self.deque[0]:
self.deque.popleft()
return ans
-
queue的get()和put()来从前端弹出和后端加入数据。
-
deque则有pop(), popleft(), append()和appendleft()方法。
-
复杂度分析
- 时间复杂度 O ( 1 ) O(1) O(1):三个函数方法的均摊时间复杂度均为 O ( 1 ) O(1) O(1);对push_back方法的弹出比新加入值小的元素,可以理解成一个元素本来应该入队后立即就出队了(O(1)时间)。 但是他们并没有立即出队,把出队的时间花的时间省下来了,然后比它们大的元素来了之后一起出队了。等于把之前省下来的时间全花掉了
- 空间复杂度 O ( N ) O(N) O(N):当元素个数为 N N N时,最差情况下deque中保存 N N N个元素,使用 O ( N ) O(N) O(N)的额外空间。
50. 第一个只出现一次的字符
哈希表
遍历字符串,用字典来存放字符个数/布尔值表示是否字符多次出现。
遍历字典,寻找字符个数为1的或者布尔值为True的。
class Solution:
def firstUniqChar(self, s: str) -> str:
dic = {}
for char in s:
dic[char] = not char in dic # 妙啊,如果为False就是字符已经出现过了
for k in dic.keys(): # Python3.6之后的字典是有序的
if dic[k]:
return k
return " "
- 复杂度分析
- 时间复杂度 O ( N ) O(N) O(N): N N N为字符串s长度,需遍历字符串s一轮与dic一轮,dic长度不大于26
- 空间复杂度 O ( 1 ) O(1) O(1):最多有26个不同字符,哈希表存储需占用 O ( 26 ) = O ( 1 ) O(26)=O(1) O(26)=O(1)的额外空间