关于序列的面试题3------------股票问题

  BAT大神hulu面试中,三面的第二道题就是股票问题,而恰巧室友在amazon面试中也遇到了这个问题。、

  问题:一个人知道未来n天的每天股票的价格,请你给出一个算法,使得这个人从哪天买入,哪天卖出能获得最大的收益。

  问题实际上就是求一个数组后面元素减前面元素的最大值

 

  O(n2)的方法就不说了。BAT大神回答的方法,复杂度是O(nlgn), 面试官说答案就是O(nlgn), 但是我室友告诉我的方法复杂度是O(n),前面一部分保存最小值都是一样的,但是后面没必要非要找到最大值:

代码如下:

 1 #include <stdio.h>

 2 #include <stdlib.h>

 3 

 4 int findMaxDiff(int a[], int len)

 5 {

 6     int i = 0;

 7     int minLeft = a[0];

 8     int max = a[1] - a[0];

 9     for(int i = 2; i < len; i++)

10     {

11         if(a[i - 1] < minLeft)

12         {

13             minLeft  = a[i-1];

14         }

15         if(a[i] - minLeft  > max)

16         {

17             max = a[i] - minLeft;

18         }

19     }

20     return max;

21 }  

22 int main()

23 {

24     int a[7] = {4, 4, 2, 14, 1, 2, 15};

25     printf("%d\n", findMaxDiff(a, 7));

26     

27     return 0;

28 }

个人觉得我O(n)应该是最优的时间复杂度

     

你可能感兴趣的:(面试题)