框架
初始化視窗端點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 第三章 棧與佇列 練習題 滑動視窗 對於最大最小值分別維護乙個優先佇列 儲存元素下標 以最小值為例。每次遇到乙個新元素,從隊尾插入。插入時刪去佇列中比該值大的元素。因為當前值出現的下標較晚,所以以後一定範圍視窗的最小值不會超過該值 隊首是當前視窗的最小值。同時要注意維護隊首的下標...