Datawhale程式設計 佇列

2022-08-03 03:36:08 字數 2178 閱讀 9863

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。乙個是隊頭指標front,它指向隊頭元素;另乙個是隊尾指標rear,它指向下乙個入隊元素的儲存位置。

每次在隊尾插入乙個元素時,rear增1;每次在隊頭刪除乙個元素時,front增1。隨著插入和刪除操作的進行,佇列元素的個數不斷變化,佇列所佔的儲存空間也在為佇列結構所分配的連續空間中移動。當front=rear時,佇列中沒有任何元素,稱為空佇列。當rear增加到指向分配的連續空間之外時,佇列無法再插入新元素,但這時往往還有大量可用空間未被占用,這些空間是已經出隊的佇列元素曾經占用過得儲存單元。

在實際使用佇列時,為了使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置。自己真從maxsize-1增1變到0,可用取餘運算rear%maxsize和front%maxsize來實現。這實際上是把佇列空間想象成乙個環形空間,環形空間中的儲存單元迴圈使用,用這種方法管理的佇列也就稱為迴圈佇列。

這道題用暴力求解不難,思路來得很快

class solution:

def maxslidingwindow(self, nums, k):

""":type nums: list[int]

:type k: int

:rtype: list[int]

"""if len(nums) == 0:

return

result =

for i in range(len(nums) + 1 - k):

slide = nums[i:i+k]

return result

咋一看時間複雜度為o(n),要不是覺得runtime太可疑我都沒注意max()函式存在乙個時間陷阱。這個方法真正的時間複雜度應該為o((l-k)n),l為nums長度,k即為所傳入引數。無論如何,都很難達到理想的o(n)。

這時候才想起提示所說的雙端佇列。**如下:

class solution:

def pushutillg(self, queue, num):

""":type queue: list[int]

:rtype: list[int]

"""try:

cmp_num = queue.pop()

while num > cmp_num:

cmp_num = queue.pop()

return queue

except:

return [num]

def maxslidingwindow(self, nums, k):

""":type nums: list[int]

:type k: int

:rtype: list[int]

"""if len(nums) == 0:

return

if k == 1:

return nums

result =

queue =

for n in nums[:k]:

queue = self.pushutillg(queue, n)

for i in range(len(nums)+1-k):

n = nums[i+k-1]

queue = self.pushutillg(queue, n)

if nums[i] == queue[0]:

queue.pop(0)

return result

這裡的關鍵是搞明白數字進隊的規律,每個進隊的數字,都要乾掉比自己小的那些節點,我畫了一幅示意圖,如下:

Datawhale 程式設計打卡 2

氣泡排序 def maopao paixu a l len a for i in range l 1 遍歷的是排好序的個數 for j in range l i 1 遍歷的是待排序的個數 if a j a j 1 temp a j a j a j 1 a j 1 temp print a retur...

Datawhale程式設計 雜湊表

雜湊表就是一種以 鍵 值 key indexed 儲存資料的結構,我們只要輸入待查詢的值即key,即可查詢到其對應的值。雜湊的思路很簡單,如果所有的鍵都是整數,那麼就可以使用乙個簡單的無序陣列來實現 將鍵作為索引,值即為其對應的值,這樣就可以快速訪問任意鍵的值。這是對於簡單的鍵的情況,我們將其擴充套...

Datawhale異常處理

try 檢測範圍 except exception as reason 出現異常後的處理 try 語句按照如下方式工作 例子 try f open test.txt print f.read f.close except oserror print 開啟檔案出錯 開啟檔案出錯 try except ...