问题:
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.
Example 1:
Input: [7, 1, 5, 3, 6, 4]
Output: 5max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)
Example 2:
Input: [7, 6, 4, 3, 1]
Output: 0In this case, no transaction is done, i.e. max profit = 0.
大意:
说你有一个由每天的股票价格组成的数组。
如果你只能进行一次交易(比如购买或者销售一个股票),设计一个算法来获取最大利润。
例子1:
Input: [7, 1, 5, 3, 6, 4]
Output: 5
最大的利润为:6-1 = 5(不是7-1 = 6,因为销售价格需要比购买价格大)
例子2:
Input: [7, 6, 4, 3, 1]
Output: 0
这个例子中,无法进行交易,所以最大收益为0。
思路:
1,首先我们将问题划分为最小集合,并且求出最小集合中的最小值mMinValue ,以及能得到的最大利润mMaxProfit 。
集合长度为1时:int[] prices = {7}
可以得到最小值mMinValue =prices[0];的值是7
可以得到最大利润是mMaxProfit 是 0 (没买、没卖,所以利润就是0);
集合长度为2时:int[] prices = {7,1}
可以得到最小是mMinValue 和 prices[1]中取最小值:
mMinValue = Math.min(mMinValue,prices[1]);
可以得到最大利润是mMaxProfit 是 0 (因为前面的价格是7,后面是1,所以如果买了股票,则就亏了。所以为了获取最大利润,最好是不买,则利润是0):
mMaxProfit = Math.max(prices[1] - mMinValue,mMaxProfit);
当集合长度是n时:
mMinValue = Math.min(mMinValue,prices[n-1]);
mMaxProfit = Math.max(prices[n-1] - mMinValue,mMaxProfit);