题目描述:
给定长度为n的整数数列:a0,a1,..,an-1,以及整数S。这个数列会有连续的子序列的整数总和大于S的,求这些数列中,最小的长度。
思路:
先遍历一遍,统计从第0个元素开始到第i个元素的和;
定义两个下标,从零开始遍历;
右下标递增,直到找到第一个如果当前子区间的值大于s;
增加左下标,找到所有以当前右下标结尾的区间内的和大于s的,最小长度的区间;
重复以上过程
求子序列的和利用之前sum数组进行运算。
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 int fun(vector<int> arr,int S) 7 { 8 if(arr.size() == 0) 9 return -1; 10 //vector<int>::iterator ite = arr.begin(); 11 vector<int> sum; 12 sum.push_back(arr[0]); 13 int i =1; 14 while(i < arr.size()) 15 { 16 sum.push_back(sum[i-1]+arr[i]); 17 ++i; 18 } 19 20 int startpos=0; 21 int endpos=0; 22 int min_len = arr.size()+1; 23 while(startpos < arr.size() && endpos < arr.size()) 24 { 25 while((endpos < arr.size()) && (sum[endpos]-sum[startpos] <= S)) 26 { 27 endpos++; 28 } 29 while((startpos < endpos)&&(sum[endpos]-sum[startpos] > S)) 30 { 31 startpos++; 32 } 33 if((startpos == endpos)&&(arr[startpos] > S)) 34 return 1; 35 if(min_len > (endpos-startpos+1)) 36 min_len = endpos-startpos+1; 37 } 38 return min_len; 39 } 40 41 int main() 42 { 43 int a[10] = {5,1,3,5,10,7,4,9,2,8}; 44 vector<int> v; 45 int i; 46 for(i = 0 ; i < 10 ; ++i) 47 v.push_back(a[i]); 48 cout<<fun(v,10)<<endl; 49 return 0; 50 }