滑動視窗經典題目Sliding windows

2021-10-07 06:24:26 字數 4767 閱讀 2338

smallest subarray with a given sum (easy)

325 maximum size subarray sum equals k

904 fruits into baskets (medium)

003 no-repeat substring (hard)

longest substring with same letters after replacement (hard)

含有不同的k個字元的最長子串

包含k個字元以上左邊界右移

有邊界右移,如果出現新的字元則count++

如果count <= k, 更新res

def

longestsubstringkdistinctletter

(nums, k)

: bitmap =

dict()

left, right =0,

0 count =

0 res =

0for i in

range

(256):

bitmap[

chr(i)]=

0while

(right <

len(nums)):

if(count > k):if

(bitmap[nums[left]]-

1==0)

: count -=

1 bitmap[nums[left]]-=

1 left +=

1continue

# 為什麼要加continue,因為

# 進入這個if的就是因為此時count>k,left必須左移到count = k,continue的意義是

# 跳過後面的right的右移

if(bitmap[nums[right]]==

0): count +=

1 bitmap[nums[right]

]= bitmap[nums[right]]+

1if(count <= k)

: res =

max(res, right - left +1)

right +=

1return res

end後移,增加sum,如果sum>value

while (sum - nums[start] >= k): start後移,更新lenn,返回2

如果sum - nums[start] < k: 返回1

def

smallestsubarray

(nums, value)

: start, end =0,

0if(len

(nums)==0

):return

0 lenn =

float

('inf'

) summ =

0while

(end <

len(nums)):

summ += nums[end]

while

(summ > value):if

(summ - nums[start]

> value)

: start +=

1 summ = summ - nums[start]

lenn =

min(lenn, end - start +1)

end +=

1return lenn

map結構儲存前n個數的n個和

如果當前k和sum存在差值,是否存在sum

def

maxsizeofsubarr

(arr, k):if

(len

(arr)==0

):return

0 sum1=

0 res=

0 hasht =

dict()

hasht[0]

=0for i in

range(0

,len

(arr)):

sum1 += arr[i]if(

(sum1 - k)

in hasht)

: res =

max(res, i +

1- hasht[sum1-k])if

(sum1 not

in hasht)

: hasht[sum1]

= i +

1return res

從任意位置開始,如果最多只能收集兩種水果,

那麼最多可以收集多少水果,我看著不方便,我理解為最多可以收集到幾顆果樹

感覺和340是一樣的

具體思路參考340

def

maximumfruits

(nums, k=2)

: bitmap =

dict()

left, right =0,

0 count =

0 res =

0for i in

range

(256):

bitmap[i]=0

while

(right <

len(nums)):

if(count > k):if

(bitmap[nums[left]]-

1==0)

: count -=

1 bitmap[nums[left]]-=

1 left +=

1continue

# 為什麼要加continue,因為

# 進入這個if的就是因為此時count>k,left必須左移到count = k,continue的意義是

# 跳過後面的right的右移

if(bitmap[nums[right]]==

0): count +=

1 bitmap[nums[right]

]= bitmap[nums[right]]+

1if(count <= k)

: res =

max(res, right - left +1)

right +=

1return res

求最長無重複子串, 給出乙個字串, 從所有子串中, 找出最長, 且沒有重複字母的子串的長度.

def

findlongestsubstr

(s):

right, left, res =0,

0,0 length =

len(s)

sett =

set(

)while

(right < length):if

(s[right]

notin sett)

: res =

max(res, right - left +1)

sett.add(s[right]

) right +=

1else

:while

(s[left]

!= s[right]):

left +=

1 sett.remove(s[left]

) left +=

1return res

替換後最長重複子串

雙指標視窗滑動法。使用兩個指標分別作為視窗的left、right,

不斷右移動right指標(擴大視窗),

將視窗中的字元數作為乙個中間結果(替換後的最長重複字元),

當視窗大小 - 視窗**現次數最多的字元數即是需要替換的字母數。

如果需要替換的字母數超過了k,則說明需要縮小視窗(右移left)。

def

maxlengthrepeatedsubstr

(strr, k)

: right, left =0,

0 lenn =

len(strr)

letter_map =

dict()

count, res =0,

0for i in

range(26

):letter_map[

chr(

ord(

'a')

+ i)]=

0while

(right < lenn)

: letter_map[strr[right]]+=

1 count =

max(count, letter_map[strr[right]])

while

(right - left +

1- count > k)

: letter_map[strr[left]]-=

1 left +=

1

res =

max(res, right - left +1)

right +=

1return res

大家共勉~

滑動視窗型別題目

3.無重複字元的最長子串 給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是1.滑動視窗本質是控制左右指標怎麼移動這裡有指標是一直往前走的,那麼左指標呢,當當前右指標指向的元素重複時左指標直接跳到這個已重複元素的下乙...

滑動視窗題目總結

最典型的滑動視窗題目 right要找到新字元,才加1,擴大視窗 left要發現舊字元就加1,縮小視窗,直到right處的flag s right 值變為0,right才繼續增加 需要注意的就是right 的位置,需要考慮清楚 define max x,y x y x y int lengthoflo...

經典滑動視窗模板題

滑動視窗 acwing154 題目 給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值 最大值 1 3 1 3 5 3 6...