滑動視窗型別題目

2021-10-02 19:10:43 字數 4692 閱讀 6237

3. 無重複字元的最長子串

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是

1.滑動視窗本質是控制左右指標怎麼移動這裡有指標是一直往前走的,那麼左指標呢,當當前右指標指向的元素重複時左指標直接跳到這個已重複元素的下乙個元素!

class solution:

def lengthoflongestsubstring(self, s: str) -> int:

if not s:return 0

res=1

p1=0

p2=1

while p2209. 長度最小的子陣列

難度中等210

給定乙個含有n個正整數的陣列和乙個正整數s ,找出該陣列中滿足其和≥ s的長度最小的連續子陣列如果不存在符合條件的連續子陣列,返回 0。

示例:

輸入:

s = 7, nums = [2,3,1,2,4,3]
輸出: 2

解釋: 子陣列

[4,3] 是該條件下的長度最小的連續子陣列。
1.暴力

2.雙指標,維持乙個sum變數記錄得到的連續子陣列的和,sum=s後左指標一直往右走

class solution(object):

def minsubarraylen(self, s, nums):

""":type s: int

:type nums: list[int]

:rtype: int

"""if not nums:

return 0

res = float('inf')

for i in range(len(nums)):

tmp_sum = nums[i]

if tmp_sum>=s:

return 1

for j in range(i+1,len(nums)):

tmp_sum+=nums[j]

if tmp_sum>=s:

res = min(res,j-i+1)

return res if res!=float('inf') else 0

class solution(object):

def minsubarraylen(self, s, nums):

""":type s: int

:type nums: list[int]

:rtype: int

"""if not nums:

return 0

res = float('inf')

l = r = 0

sum_ = 0

while r=s:

res = min(res,r-l+1)

sum_-=nums[l]

l+=1

else:

sum_+=nums[r]

r+=1

return res if res!=float("inf") else 0

239. 滑動視窗最大值

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。

返回滑動視窗中的最大值。

1.python語言切片特性  o(nk) 一行**

2.暴力  o(nk)

3.堆,本質這題是在每乙個區間裡得到最大的值,大頂堆可以在o(logn)的時候得到最大值 ,共o(nlogk)

4.雙向佇列 o(n)

1.雙向佇列的頭部始終保持這個區間裡最大的值

2.當滑動視窗移動的時候要把這個視窗裡過期的值去掉

class solution(object):

def maxslidingwindow(self, nums, k):

return [max(nums[i:i+k]) for i in range(len(nums)-k+1)] if nums else

class solution(object):

def maxslidingwindow(self, nums, k):

if not nums:

return nums

res =

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

tmp = float('-inf')

for j in range(i,i+k):

tmp=max(tmp,nums[j])

return res

class solution(object):

def maxslidingwindow(self, nums, k):

q = collections.deque()

res =

for i,num in enumerate(nums):

while q and q[0]<=i-k:

q.popleft()

while q and num>nums[q[-1]]:

q.pop()

if i>=k-1:

return res

8、438. 找到字串中所有字母異位詞

給定乙個字串s和乙個非空字串p,找到s中所有是p的字母異位詞的子串,返回這些子串的起始索引。

字串只包含小寫英文本母,並且字串sp的長度都不超過 20100。

說明:

示例 1:

輸入:

s: "cbaebabacd" p: "abc"

輸出:[0, 6]

解釋:起始索引等於 0 的子串是 "cba", 它是 "abc" 的字母異位詞。

起始索引等於 6 的子串是 "bac", 它是 "abc" 的字母異位詞。

1.hash滑動

class solution(object):

def findanagrams(self, s, p):

""":type s: str

:type p: str

:rtype: list[int]

"""if not s:

return

res =

hash_table = [0 for _ in range(26)]

hash_s1 = [0 for _ in range(26)]

for one in p:

hash_s1[ord(one)-97]+=1

l = r = 0

while r給定兩個字串s1s2,寫乙個函式來判斷s2是否包含s1的排列。

換句話說,第乙個字串的排列之一是第二個字串的子串。

示例1:

輸入: s1 = "ab" s2 = "eidbaooo"

輸出: true

解釋: s2 包含 s1 的排列之一 ("ba").

1.hash滑動!很nice的乙個題

1.定製乙個和s1大小一樣的滑動視窗

2.每滑動一次就判斷這個視窗裡的內容是否是s1的子串(其實只要相同字母個數相同就是子串),怎麼做?題目給定是小寫字母,因此給s1和滑動視窗各乙個記憶空間,記憶當前已經擁有哪些字母!

class solution(object):

def checkinclusion(self, s1, s2):

if len(s1)>len(s2):

return false

hash_table = [0 for _ in range(26)]

hash_s1 = [0 for _ in range(26)]

for one in s1:

hash_s1[ord(one)-97]+=1

l = r = 0

while rif hash_table==hash_s1:

return true

if rhash_table[ord(s2[r])-97]+=1

r+=1

else:

hash_table[ord(s2[r])-97]+=1

r+=1

hash_table[ord(s2[l])-97]-=1

l+=1

return hash_table==hash_s1

滑動視窗題目總結

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

滑動視窗經典題目Sliding windows

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 sub...

滑動視窗型別題

第一題 滑動視窗的最大值 來自 劍指offer 題目 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 第二題 dna序列 來自 牛客網 華為機試 題目 輸入描述 輸入乙個s...