程序员面试真题--(3)

题目描述:

给定长度为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 }
原文地址:https://www.cnblogs.com/cane/p/3844535.html