算法-数组:长度最小的子数组
在一个正整数数组nums中找到最小长度的连续子数组,使子数组元素之和大于或等于s,返回满足条件的连续子数组的最小长度,如果没找到则返回0。
#include <iostream>
#include <vector>
using namespace std;
//方法一:暴力解法,两个for循环,依次遍历从0开始的每个满足条件的连续子数组,记录其中长度最小的那个
int method(vector<int>& nums,int target){
int n = nums.size();
int minlength = INT_MAX;
int length = INT_MAX;
for(int i = 0; i < n; i++){
int sum = 0;
for(int j = i; j < n; j++){
sum += nums[j];
if(sum >= target){
length = j-i+1;
break;
}
}
minlength = (minlength<length)?minlength:length;
}
return minlength;
}
int main(){
int n;//数组长度
cin>>n;
vector<int> nums;
int num;
for(int i = 0; i < n; i++){
cin>>num;
nums.push_back(num);
}
int target;
cin>>target;
cout<<"满足条件的最小长度为:"<<method(nums,target);
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
//方法二:滑动窗口,是双指针方法的一种,保持窗口内的数值总和满足条件
//重点关注起始位置,找到的结束位置就可以判断长度
int method(vector<int>& nums,int target){
int n = nums.size();
int begin = 0;//起始位置
int sum = 0;
int minlength=INT_MAX;//用于记录最小长度
int length;
for(int end = 0; end < n; end++){
sum += nums[end];
while(sum >= target){
length = end-begin+1;
minlength = (minlength<length)?minlength:length;
sum -= nums[begin++];//不断变更子数组的起始位置!!!起始位置向右移动一位
}
}
return minlength;
}
int main(){
int n;//数组长度
cin>>n;
vector<int> nums;
int num;
for(int i = 0; i < n; i++){
cin>>num;
nums.push_back(num);
}
int target;
cin>>target;
cout<<"满足条件的最小长度为:"<<method(nums,target);
return 0;
}