适用题目关键词:
满足...条件的最长/短(子)字符串
思路:
核心:
- RL双指针,起始位置,R指针向右逐位滑动循环
- RL指针间形成窗口
滑动:
1寻找满足条件的最长子串
- if(窗口内元素满足条件):R继续向右扩大窗口,L不动,更新最优结果
- if(不满足条件):L向右滑动至R位置,缩小窗口
2寻找满足条件的最短子串
- if(窗口内元素满足条件):L继续向右缩小窗口,R不动,更新最优结果
- if(不满足条件):R向右滑动扩大窗口
结束:
- R到达结尾
模板:
初始化双指针L,R,result,bestResult
while(R<end){
//寻找最长子串
扩大窗口:加入R对应元素,更新当前result
while(result不满足条件)
{
缩小窗口:L右移
}
更新bestResult
//寻找最短子串
扩大窗口:加入R对应元素,更新当前result
while(result满足条件)
{
更新bestResult
缩小窗口:L右移
}
R++
}
返回bestResult
实例:
leetcode 209. 长度最小的子数组
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其和
≥ target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。
public class Solution {
public int MinSubArrayLen(int target, int[] nums) {
//初始化双指针
int r=0,l=0,minL=0,sum=0;
int len= nums.Length;
//滑动窗口
while(r<len){
//记录当前结果
sum+=nums[r];
//满足条件,缩小窗口
while(sum>=target){
//更新min
if(r-l+1<minL||minL==0)
minL=r-l+1;
//缩小窗口
sum-=nums[l];
l++;
}
r++;
}
return minL;
}
}
参考: