算法题应用场景
关键字:
满足xxx条件(计算结果、出现次数、同时包含)
最长/最短
子串/子数组/子序列
例如:长度最小的子数组
滑动窗使用思路之寻找最长
—— 核心:左右双指针(L,R)在起始点,R逐位滑动循环
—— 每次滑动过程中
若: 窗内元素满足条件,R向右扩大窗口,并更新最优结果
若:窗内元素不满足条件,L向右缩小窗口
—— R到达结尾
最长代码模板
// 最长模板
// 初始化left,right,result,baseResult
while(右指针没有到结尾){
窗口扩大,加入right对应元素,更新当前result
while(result不满足要求){
窗口缩小,移除left对应元素,left右移
}
更新最优结果baseResulet
right++;
}
返回 baseResult
滑动窗使用思路之寻找最短
—— 核心:左右双指针(L,R)在起始点,R逐位滑动循环
—— 每次滑动过程中
若: 窗内元素满足条件,L向右缩小窗口,并更新最优结果
若:窗内元素不满足条件,R向右扩大窗口
—— R到达结尾
最短代码模板
// 最短模板
// 初始化left,right,result,baseResult
while(右指针没有到结尾){
窗口缩小,加入right对应元素,更新当前result
while(result满足要求){
更新最优结果baseResulet
窗口扩大,移除left对应元素,left右移
}
right++;
}
返回 baseResult
示例:力扣209 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let left = 0,right = 0 ;
let curSum = 0;
let minLength = 0;
let len = nums.length;
while(right < len){
curSum += nums[right];
while(curSum >= target){
// 满足条件 更新最优结果
if(right - left+1 < minLength || minLength == 0){
minLength = right - left +1
}
// 不满足条件,移除左指针元素,左指针右移
curSum = curSum - nums[left];
left++;
}
right++;
}
return minLength
};