先说点股票的事,对股票一无所知,我问明哥,比如说我今天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 }