陣列 滑動視窗

2021-10-04 03:24:25 字數 2498 閱讀 1932

滑動視窗大多用於處理連續子陣列問題,然後得到相應的長度。

例題:長度最小的子陣列

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

思路:使用滑動視窗i在左邊,j在右邊,明確意義[i,j]為滑動視窗(閉區間)。如果滑動視窗內的和小於s,則j++來擴大視窗範圍。否則說明達到題目要求,記錄此時的長度,然後i++,使視窗縮小。重複以上步驟直到i到達陣列末尾,注意不要讓j越界。

時間複雜度:o(n)

class

solution

if(tmpreturn0;

//假如不存在,返回0

int i =0;

int j =0;

int sum = nums[0]

;int res = integer.max_value;

while

(ielse

}else

}return res;

}}

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

還是一樣,使用滑動視窗,假如未出現重複元素,則j++擴大視窗,假如出現了則i++縮小視窗。未重複的時候記錄當前長度,最後輸出最長長度。

注意,沒有說過只有小寫字母,所以用個set。

2.找到字串中所有字母異位詞

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

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

說明:字母異位詞指字母相同,但排列不同的字串。 不考慮答案輸出的順序。

lass solution 

while

(jlength()

)if(arrays.

equals

(nums,tmp)

) list.

add(i)

; i++

; j++;}

return list;

}}

**可行,不過涉及陣列的比較,於是執行十分緩慢,想到的第乙個優化點是,如果遍歷到了根本不屬於目標字串的字母,那麼直接滑動視窗跳到它的後面。這樣一來,時間消耗減少了一半。

3.最小覆蓋子串

給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字母的最小子串。

示例:輸入: s = 「adobecodebanc」, t = 「abc」 輸出: 「banc」

說明: 如果 s 中不存這樣的子串,則返回空字串 「」。

如果 s 中存在這樣的子串,我們保證它是唯一的答案。

首先,用我薄弱的大腦想一想,可以設定乙個雜湊表,然後儲存t中所有字元的對應出現次數。然後依然是不固定大小的滑動視窗遍歷,如果未滿足要求,就j++,滿足要求就i++,每次滿足要求時儲存一下ij的值,根據j-i的大小取捨。

那麼怎麼判斷是否滿足條件呢?規定每次新增乙個元素x,如果它在map中,那麼值-1;每次刪除乙個元素x,如果它在map中,那麼值+1。如果此時map中的值全為0,說明以及符合條件。

class

solution

int i =0;

int j =-1

;int resj = s.

length()

-1;int resi =0;

boolean flag =

true

;//判斷是否不存在這樣的子串

while

(jlength()

)if(map.

containskey

(s.charat

(i))

) i++

;//滑動視窗縮小

}else}}

}if(flag)

return"";

return s.

substring

(resi,resj+1)

;}public

boolean

isempty

(map

map)

return

true;}

}

陣列 滑動視窗

leetcode 209.長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長...

陣列 滑動視窗

leetcode 209.長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長...

陣列 滑動視窗

給定乙個含有 n 個正整數的陣列和乙個正整數 target 找出該陣列中滿足其和 target 的長度最小的連續子陣列 numsl,numsl 1,numsr 1,numsr 並返回其長度。如果不存在符合條件的子陣列,返回 0 示例 1 輸入 target 7,nums 2,3,1,2,4,3 輸出...