滑動視窗的應用 python實現

2021-10-22 21:05:22 字數 2871 閱讀 2136

框架

初始化視窗端點l,r,一般l為0,r為1

初始化最優值

while r <

len(array)

:while r <

len(array)

: r +=

1#移動右端點

if r <

len(array)

: 更新狀態

if 狀態滿足條件:

可選的更新最優值的位置

break

#一旦滿足條件即跳出

if r ==

len(array)

:# 若迴圈是由於移動到陣列末尾結束,則停止整個程式。因為之後已經不再有可能的解

break

while l < r:

更新狀態 # 移動左端點,需要更新狀態

l +=

1if 狀態滿足條件:

可選的更新最優值的位置

else: # 一旦視窗所在區間不再滿足條件即跳出,去移動右端點

break

可選的對於l,r端點的後續處理

return 最優值

依次解讀:

第一層迴圈保證了右部標記不會超出陣列,之後將右部標記移動至剛好滿足條件的地方,結束while迴圈,為什麼能夠保證第一層迴圈不會溢位呢,因為只要r不等於陣列長度,就可以保證所有的r可能性都已經遍歷完了,也就代表著所有對應的左側標記也已標記完成,即所有情況也已經完成,第二層while迴圈表示移動左部標記使其不滿足條件,然後紀錄其狀態,之後迴圈,得到最優位置。

例題:**:

class

solution

:def

minsubarraylen

(self, target:

int, nums: list[

int])-

>

int:

left,right,minvalue,sumvalue =0,

-1,float

('inf'),

0#初始化,left為

while

(right<

len(nums)):

#while迴圈保證

while

(right<

len(nums)):

right +=

1#右邊逐漸移動

if(right<

len(nums)):

sumvalue+=nums[right]

#一直相加

if(sumvalue>=target)

: minvalue =

min(minvalue,right-left+1)

#在兩者之間比較出最小值

break

if(right==

len(nums)):

break

while

(left: sumvalue-=nums[left]

left+=1if

(sumvalue>=target)

:#也就是在left+1之後還小於

minvalue =

min(minvalue,right-left+1)

else

:#如果還能小就退出

break

if(minvalue==

float

('inf'))

:return

0return minvalue

上面的**一開始看著有點複雜,但是可以保證許多情況下都適用,

這道題其實沒什麼不同,也就是判斷的情況不同了幾種,判斷最大值仍在right擴大的過程中尋找,因為在left移動時是不會存在最大值的,詳細看**就行

class

solution

:def

lengthoflongestsubstring

(self, s:

str)

->

int:

left,right,=0

,-1#將right賦值為-1的好處是第乙個迴圈不會崩掉

list1 =

#這裡面的陣列不會有重複字元

minvalue =

0while

(right<

len(s)):

while

(right<

len(s)):

right+=1if

(right>=

len(s)):

minvalue =

max(minvalue,right-left)

break

if(s[right]

notin list1):#

)#如果不重複就加入陣列

else

:#如果在這裡面了就計算最大值

minvalue =

max(minvalue,right-left)

#這裡面寫right - left的原因是right本身就不算了

break

if(right==

len(s)):

break

while

(left(s[left]

!=s[right]):

#如果不等於的話就繼續找,並移除數字

list1.remove(s[left]

) left+=

1else

:#找到了就將left向右移動一格,並退出迴圈

left+=

1break

return minvalue

滑動視窗問題的實現

int left 0,right 0 while right s.size class solution hashmapmap new hashmap int max 0 int left 0 for int i 0 i s.length i map.put s.charat i i max mat...

滑動視窗詳解及其應用

僅供自己複習 借鑑李威大佬的 滑動視窗說白了也是雙指標的一種變體,不過區別在於最開始視窗裡為空 也就是說左右指標指向同乙個 然後不斷移動右邊的指標,直到滿足某條件後再收縮左邊的指標 所以一般是雙層迴圈,第一層迴圈動右指標,第二層迴圈動左指標,然後滿足某條件或終止條件就返回 自個兒總結了乙個模板 fu...

POJ 滑動視窗 優先佇列的應用

資料結構與演算法a 第三章 棧與佇列 練習題 滑動視窗 對於最大最小值分別維護乙個優先佇列 儲存元素下標 以最小值為例。每次遇到乙個新元素,從隊尾插入。插入時刪去佇列中比該值大的元素。因為當前值出現的下標較晚,所以以後一定範圍視窗的最小值不會超過該值 隊首是當前視窗的最小值。同時要注意維護隊首的下標...