Best Time to Buy and Sell Stock

先说点股票的事,对股票一无所知,我问明哥,比如说我今天10元买了个股票,明天11元,后天12元,那我后天是不是赚了3元?

他说不是,股票只有卖了才有钱,也就是说后天卖了的话,赚2元。

一般都会提到的算法是分治和动态规划(《剑指offer》中的第一种方法也很好,容易理解),动态规划后面再去实现,看到http://blog.csdn.net/iammiaoyan/article/details/11730059中说的另外一种感觉容易被忽视的方法(虽然很常见):要求最大的收益,自然是用最高的股票价格减去最低的价格即可,考虑到时间的因素,当前的收益一定是当天价格减去前面几天里的最低价格即可。

 1     //如果面试呗问到,一些东西需要当面问清楚,比如:如果最大收益是负值返回什么
 2     int maxProfit(vector<int> &prices) {
 3         int n=prices.size();
 4         if(n<=1)
 5             return 0;
 6         int i,min=prices[0],max_profit=0;
 7         for(i=1;i<n;++i){
 8             max_profit=(prices[i]-min)>max_profit?prices[i]-min:max_profit;
 9             min=prices[i]<min?prices[i]:min;
10         }
11         return max_profit;
12     }

AC

 1     int maxProfit(vector<int> &prices) {
 2         int n=prices.size();
 3         if(n<=1)
 4             return 0;
 5         int i,max;
 6         int a[n-1];//第二天的减去第一天的,表示增值
 7         int w[n-1];
 8         for(i=0;i<n-1;++i)
 9             a[i]=prices[i+1]-prices[i];
10         w[0]=a[0];
11         for(i=1;i<n-1;++i){
12             if(w[i-1]<0)
13                 w[i]=a[i];
14             else
15                 w[i]=w[i-1]+a[i];
16         }
17         max=w[0];
18         for(i=1;i<n-1;++i)
19             max=w[i]>max?w[i]:max;
20         if(max<0)
21             max=0;
22         return max;
23     }

AC

稍微优化一下

 1     int maxProfit(vector<int> &prices) {
 2         int n=prices.size();
 3         if(n<=1)
 4             return 0;
 5         int i,max_profit;
 6         int a[n-1];//第二天的减去第一天的,表示增值
 7         //int w[n-1];
 8         int pre;
 9         for(i=0;i<n-1;++i)
10             a[i]=prices[i+1]-prices[i];
11         pre=a[0];
12         max_profit=a[0];
13         for(i=1;i<n-1;++i){
14             if(pre<0)
15                 pre=a[i];
16             else{
17                 pre+=a[i];
18                 max_profit=pre>max_profit?pre:max_profit;
19             }
20                 
21         }
22         if(max_profit<0)
23             max_profit=0;
24         return max_profit;
25     }

WA

第13-19行错了,改为:

1         for(i=1;i<n-1;++i){
2             if(pre<0)
3                 pre=a[i];
4             else
5                 pre+=a[i];
6             max_profit=pre>max_profit?pre:max_profit;
7                 
8         }
原文地址:https://www.cnblogs.com/crane-practice/p/3616813.html