一 题目:
给定一个含有 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
二 思路:
滑动窗口方法
1.定义滑动窗口的起始位置i和j
2.首先移动j,并将j位置的值进行相加sum+=nums[j];如果和刚好大于等于目标值x,就将这段数组的长度记录到res中后面比较选出最小的返回,然后开始改变滑动窗口的大小,将i向前移动一个元素并将sum减去之前i位置的值sum-=nums[i++];这个地方是改变滑动窗口大小的精髓。
三 代码:
#include <bits/stdc++.h>
using namespace std;
int n=0,m=0;//两个临时变量
int fun(int nums[],int size,int x) {
int res=INT_MAX;
int sum=0;//滑动窗口的数值和
int i=0;//滑动窗口起始位置
int len=0;//滑动窗口的长度
for (int j = 0; j < size; ++j) {
sum+=nums[j];
while(sum>=x){
len=(j-i+1);//子数组的长度
if (len<res){
res=len;
n=i;
m=j;
}
sum-=nums[i++];//这个地方改变i是滑动窗口的精髓(改变起始位置)
}
}
return res==INT_MAX ? 0:res;
}
int main() {
int a[]={2,3,1,2,4,3};
int size=sizeof(a)/sizeof(a[0]);
int target;
cin>>target;
//输出最小子数组的长度
cout<<fun(a,size,target)<<endl;
//输出最小子数组的值
for (int i = n; i <=m ; ++i) {
cout<<a[i]<<" ";
}
return 0;
}