• 程序员面试真题--(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 }
  • 相关阅读:
    [USACO08MAR]土地征用Land Acquisition
    树链剖分
    [AHOI2008]紧急集合 / 聚会
    P1852 [国家集训队]跳跳棋
    Ant Trip(欧拉回路+并查集)
    单词游戏
    POJ3694 Network
    C++ STL小总结
    2-Sat专题
    6大名家带你穿越大半个中国去深思
  • 原文地址:https://www.cnblogs.com/cane/p/3844535.html
Copyright © 2020-2023  润新知