这是一道非常简单的双指针的题,简单的思路就是滑动窗口实现对子数组的更新以及状态的判断,在说这道题之前,我们先简单的了解一下滑动窗口
滑动窗口是通过每次移动固定大小的窗口来遍历数据序列的一种常用技术。它通常用于处理连续的数据流或者需要局部数据处理的问题。滑动窗口可以在数据序列上进行滑动,以便我们可以在每个窗口中执行特定的操作。
在算法和数据处理中,滑动窗口通常涉及以下几个步骤:
- 初始化窗口的起始位置i。
- 将窗口尾部j移动到下一个位置。
- 在每个窗口内对窗口中的数据进行操作或计算。
- 重复步骤2和3,直到滑动窗口到达数据序列的末尾。
简单的说就是用双指针来判断区间内的数组是否满足条件
就拿力扣这个题来说,我们要找到长度最小的满足sum值大于目标值的子数组,首先我们要定义两个指针i,j,然后将j放入循环,注意j是尾部指针,因为如果是头部指针的话,j每次移动i都要再次遍历整个vector容器,时间复杂度与暴力做法无异。j每次向前移动,我们都会将j指针指向的元素加入sum中,并对sum做出判断,如果大于目标值,我们将向前移动i指针,并将i指针移动前指向的元素从sum中减去,然后不断更新我们的子数组长度,下面我们来放一下代码。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0,j;
int result=100005;
int sum=0;
int subl=0;//区间长度
for(j=0;j<nums.size();j++){
sum=sum+nums[j];
while(sum>=target){
subl=j-i+1;
result=min(subl,result);//更新子数组长度
sum=sum-nums[i];
i++;
}
}
if(result==100005){
result=0;
}//如果没有满足条件的子数组,则返回0
return result;
}
};
觉得有用的兄弟们可以持续关注一下,后续会持续更新c++高性能服务器,力扣,蓝桥杯,unity,和计算机网络以及数据结构的相关知识