滑動視窗大多用於處理連續子陣列問題,然後得到相應的長度。
例題:長度最小的子陣列
給定乙個含有 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 所有字母的最小子串。首先,用我薄弱的大腦想一想,可以設定乙個雜湊表,然後儲存t中所有字元的對應出現次數。然後依然是不固定大小的滑動視窗遍歷,如果未滿足要求,就示例:輸入: s = 「adobecodebanc」, t = 「abc」 輸出: 「banc」
說明: 如果 s 中不存這樣的子串,則返回空字串 「」。
如果 s 中存在這樣的子串,我們保證它是唯一的答案。
j++
,滿足要求就i++
,每次滿足要求時儲存一下i
和j
的值,根據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 輸出...