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;
}