算法:滑动窗口(三)

209. 长度最小的子数组 - 力扣(LeetCode) (leetcode-cn.com)

给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

滑动窗口

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let l = 0, r = -1
    let sum = 0;
    let res = nums.length + 1 // 最小连续子数组的长度
    while(l < nums.length) {
        if(r + 1 < nums.length && sum < target){
            r++;
            sum += nums[r]
        } else {
            sum -= nums[l];
            l++
        }
        if(sum >= target) {
            res = Math.min(res, r - l +1)
        }
    }
    if(res === nums.length + 1) {
        return 0
    }
    return res
};
3. 无重复字符的最长子串 - 力扣(LeetCode) (leetcode-cn.com)

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

思路:滑动窗口

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s){
    let l = 0; // 左指针为0
    let res = 0; // 最大窗口的长度
    for(let r = 0; r < s.length; r++) { // 右指针
       if(map.has(s[r]) && map.get(s[r]) >= l) {
            l = map.get(s[r]) + 1
       }
       res = Math.max(res, r - l + 1); // 窗口长度的最大值
       map.set(s[r], r)
    }
    return res;
}

你可能感兴趣的:(算法:滑动窗口(三))