最近遇到两道滑动窗口的题都没有解出来,借此来学习这个早已熟悉却不怎么会用的概念。
Sliding Window:其实看到类似满足xx的最小区间的子串这类问题自然可以想到滑动窗口。
一般滑动窗口要维护两个指针,l,r
1.当窗口内到元素未达到条件时, r++
2.当窗口内到元素达到条件时,l++
function slideWindow(nums){
let n = nums.length()
let l = 0, r = 0, ans = 0
while(r < n){
while(nums[l,r] is Valid){
l++
}
res = Math.max(ans,r-l+1)
r++
}
return ans
}
最短超串:力扣76
/**
* @param {number[]} big
* @param {number[]} small
* @return {number[]}
*/
var shortestSeq = function(big, small) {
let map = new Map(), n = big.length, min = n
let l = 0, r = 0, diff = small.length, res = []
for(let num of small){
map.set(num,(map.get(num)|| 0) + 1)
}
for(;r<n;r++){
// 这个有讲究的,如果big数组里有相同的数字diff就不能乱减
if(map.has(big[r])){
if(map.get(big[r])>0)
diff--
map.set(big[r],map.get(big[r])-1)
}
while(diff == 0){
if(r-l < min){
min = r - l
res.push([l,r])
}
if(map.has(big[l])){
map.set(big[l],map.get(big[l])+1)
if(map.get(big[l]) > 0)
diff++
}
l++
}
}
if(res.length) return res[res.length-1]
else return []
};