121. Best Time to Buy and Sell Stock(详解)

问题:

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: 5

max. 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: 0

In 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);

 

转载于:https://my.oschina.net/appleliu/blog/1837858

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值