【LeetCode热题100】和为 K 的子数组+滑动窗口最大值+最小覆盖子串

和为 K 的子数组

思路
巧妙应用前缀和
先计算每个位置的sum为多少,用res[i]记录下来
然后后一位res遍历减去前面的各位res,看是否等于k

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function(nums, k) {
    let res=0;sum=0,j=0;
    const record=[]
    for(let i=0;i<nums.length;i++){
        sum+=nums[i]
        record[i]=sum
        if(sum===k) res++;
    }
    for(let i=1;i<nums.length;i++){
        for(let j=0;j<i;j++){
            if(record[i]-record[j]===k) res++;
        }
    }
    return res;
};

滑动窗口最大值

思路
队列头保存最大值,新进来的值放到队列尾部
放到队列尾部之前,先要判断一下是不是比之前的尾部大(因为队头是最大值,对位不可能成为最大值了),如果大,就把之前的尾部删掉
如果队列头部出了滑动窗口,即队列头部的下标小于等于当前i-k,那么就删掉他
如果当前i大于等于k-1了,即已经形成窗口了,那么就记录当前窗口的最大值。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    let res=[]
    let temp=[]
    for(let i=0;i<nums.length;i++){
        while(temp.length!=0&&nums[temp[0]]<=nums[i]){
            temp.shift()
        }
        temp.unshift(i)
        if(temp[temp.length-1]<=(i-k))
            temp.pop()
        if(i>=(k-1)){
            res.push(nums[temp[temp.length-1]])
        }
    }
    return res
};

最小覆盖子串

思路
用双指针。
左右两个指针遍历字符串s。
当滑动窗口中的字符不能覆盖t中的字符时,右指针右移,扩大窗口,把右边的字符加入滑动窗口。
当滑动窗口中的字符能覆盖t中的字符时,不断左移指针,缩小窗口,直到窗口中的字符刚好能覆盖t中的字符,不断更新最小覆盖子串。

/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
    let need={}//需要覆盖的字符串频数
    let window={}//需要滑动的字符串频数
    for(let a of t){
        need[a]=(need[a]||0)+1//统计t中字符频数
    }
    let l=0,r=0;
    let valid=0;//滑动窗口中能覆盖的字符种类数
    let start=0;//最小覆盖子串的起始索引
    let len=Number.MAX_VALUE;//最小覆盖子串长度
    while(r<s.length){
        let c=s[r]
        r++;
        if(need[c]){
            window[c]=(window[c]||0)+1
            if(window[c]==need[c]) valid++;
        }

        while(valid==Object.keys(need).length){
            if(r-l<len){
                start=l;
                len=r-l;
            }
            let d=s[l]
            l++
            if(need[d]){
                if(window[d]==need[d]) valid--
                window[d]--
            }
        }
    }
    return len==Number.MAX_VALUE?"":s.substr(start,len);
};

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)