LeetCode——Best Time to Buy and Sell Stock I (股票买卖时机问题1)

问题:

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

大意是:有一个数组,数组的下标表示第几天,对应的值表示这一天的股票价格。如果只能买卖股票各一次(先买后卖),且每次交易量为一股,请设计一个算法求得最大收益。

 

分析:

首先理解题意,题目中的意思是初始手中是没有股票的,所以只能先买后卖,也就是说如果只有数组长度>=2,且a[1]>a[0]的时候才可能出现大于0的收益。

 

理解了题意然后再考虑如果解决这个问题。

 

在看完这道之后我的第一个想法是遍历一遍数组,找到其中的最小值、最大值,然后相减就是最终的结果,显然,,,不会有这么简单的题,,由于是先买才能卖,所以不一定是最大减最小,例如:[5,4,3,2,1],怎么都赚不了钱,怎么最大减最小。所以,继续思考。。

 

其实仔细思考这个问题,可以发现这其实是一个动态规划问题。

什么是动态规划问题?

简单的来说,动态规划问题是指某个问题可以分成若干个阶段,而每个阶段都可以从若干个以前的阶段通过一个最优策略转移过来,而当前阶段的最优解就是从这些转移的过程中选出最好的那个,由于每一个前面考虑过的阶段的状态都是最优的,所以当前的阶段所处的状态也是最优的。

 

带入到这道题中来,

怎么分成若干个阶段?

我们考虑第一阶段是在第1天买股票的最大收益,第二阶段是在第1天买股票的最大收益,以此类推。。。

那么如何找到最优策略呢?

第1天,最高价格(max)=最低价格(min)=a[0],所以最大收益profit=max-min=0;

第2天,由于第一阶段的最大收益是0,所以这一阶段只需要考虑有了a[1]这个价格加入之后最大的收益是否大于0,否则最大收益还是0,由a[1]产生的最大的收益是a[1]-min,那么第二阶段的最大收益也就是a[1]-min和第一阶段的最优值相比的较大的值,

以此类推,那么

第n天,最大的收益就是max(a[n-1]-min,profit[n-2]),这里由于数组下标从0开始,所以第n天是a[n-1]。

 

到此这道题解决完毕。

代码如下(java):

public class Solution {
    public int maxProfit(int[] prices) {
        if(prices == null || prices.length == 0)return 0;
        int profit = 0;
        int min = prices[0];
        for(int i=1; i<prices.length;i++){
           min = prices[i]<min?prices[i]:min;
           profit = prices[i]-min>profit?prices[i]-min:profit;
        }
        
        return profit;
    }
}
posted @ 2014-10-09 21:05  苍枫露雨  阅读(1061)  评论(0编辑  收藏  举报