日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

队列的基础概念与经典题目(Leetcode题解-Python语言)

發布時間:2023/12/4 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 队列的基础概念与经典题目(Leetcode题解-Python语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隊列是先入先出后入后出)的數據結構,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以。

普通隊列

225. 用隊列實現棧

class MyStack:def __init__(self):self.queue1 = []self.queue2 = []self.size = 0def push(self, x: int) -> None:self.size += 1self.queue1.append(x)def pop(self) -> int:# if self.empty(): 題目中保證了不會 pop 空# return Nonefor _ in range(self.size-1):self.queue2.append(self.queue1.pop(0))self.size -= 1self.queue1, self.queue2 = self.queue2, self.queue1return self.queue2.pop(0)def top(self) -> int:# if self.empty():# return Nonereturn self.queue1[-1]def empty(self) -> bool:return self.size == 0

題目要求用兩個隊列實現棧,很簡單,push 的操作是一樣的,只不過在 pop 的時候不能 pop 隊列最后一個元素,而要一直 pop 隊首元素到另一個隊列,只剩下的那一個元素即為棧頂元素,彈出它即可。顯然用一個隊列也能實現:

class MyStack:def __init__(self):self.queue = []def push(self, x: int) -> None:self.queue.append(x)def pop(self) -> int:# if self.empty():# return Nonefor _ in range(len(self.queue)-1):self.queue.append(self.queue.pop(0))return self.queue.pop(0)def top(self) -> int:# if self.empty():# return Nonereturn self.queue[-1]def empty(self) -> bool:return len(self.queue) == 0

346. 數據流中的移動平均值

class MovingAverage:def __init__(self, size: int):self.queue = []self.size = sizeself.sum = 0def next(self, val: int) -> float:if len(self.queue) < self.size:self.queue.append(val)else:self.sum -= self.queue[0]self.queue.pop(0)self.queue.append(val)self.sum += valreturn self.sum / len(self.queue)

這題是利用隊列實現滑動窗口,窗口滿了之后每次新加進來一個數 val,計數器 sum 就減去隊首元素 queue[0],然后加上 val 即可。

622. 設計循環隊列

class MyCircularQueue:def __init__(self, k: int):self.front = 0self.rear = 0self.size = k+1self.queue = [0 for _ in range(k+1)]def enQueue(self, value: int) -> bool:if self.isFull():return Falseelse:self.rear = (self.rear + 1) % self.sizeself.queue[self.rear] = valuereturn Truedef deQueue(self) -> bool:if self.isEmpty():return Falseelse:self.front = (self.front + 1) % self.sizereturn Truedef Front(self) -> int:return self.queue[(self.front + 1) % self.size] if not self.isEmpty() else -1def Rear(self) -> int:return self.queue[self.rear] if not self.isEmpty() else -1def isEmpty(self) -> bool:return self.front == self.reardef isFull(self) -> bool:return (self.rear + 1) % self.size == self.front

設計循環隊列的核心是對長度取余,特別是只對加 1 的情況取余,而除了隊列為空時首尾指針一樣,其余情況下尾指針都在首指針的左邊。注意不要忘記判斷隊列空或者滿的情況。

優先隊列

優先隊列常用二叉堆實現,相應的題目見這篇博客。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的队列的基础概念与经典题目(Leetcode题解-Python语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。