滑动窗口 力扣最短超串

最近遇到两道滑动窗口的题都没有解出来,借此来学习这个早已熟悉却不怎么会用的概念。

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 []
    
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值