LeetCode 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.
题目标签:Array, Dynamic Programming
题目给了我们一个array, 每一个数字代表了当时股票价格。让我们找出最大的收益。
来更新一下,之前写的解题思路有点错误,所以这里重新写。
试想一下,什么时候才有收益? Example 2 里就不存在最大收益,那么最基本是的 有一个小的值在前面,一个大的值在后面才有收益。
那么什么时候才是 最大收益? 当一个最大收益出现时候,从index 0 开始 到 后面那个 卖出的价格 这个区间里,买入的价格肯定是这个区间里的min,卖出的是 从买入价格开始 到 卖出价格 这段区间里的max。
那么是不是意味着 我们只要找到array里的min 和在min 之后范围里的max 就对了呢? 这是之前想错的地方。
举个例子:7 14 1 5 3 6 4 这里最小的是1 在1后面最大的是6, 1 和 6的 profit 是5, 但是这里最大的收益是 14 - 7 = 7。
所以我们要在遍历的过程中,一直维护更新一个min, 这个min最终的确是最小的那个,但是我们需要的min不一定是整个array中最小的。在遍历中,对于每一次的 收益 (目前的price - 目前的min),都要检查它是不是可能成为最大的收益。 这样做的目的是因为:我们不知道我们需要的min 是在什么时候出现,所以我们要检查所有 price - min 的可能性。因为上面的黑体字,最大收益肯定出现在 一段区间内, 买入的价格是区间里的min。
Java Solution:
Runtime beats 88.15%
完成日期:04/06/2017
关键词:Array, Dynamic Programming
关键点:时时保存最小价钱,对于每一个价钱,利用当前价格 - 最小价格, 保存最大收益值
1 class Solution 2 { 3 public int maxProfit(int[] prices) 4 { 5 int maxProfit = 0; 6 int min = Integer.MAX_VALUE; 7 8 for(int price: prices) 9 { 10 // keep updating the min all the time 11 min = Math.min(min, price); 12 // check each possible maxProfit and keep the larest one 13 maxProfit = Math.max(maxProfit, price - min); 14 } 15 16 return maxProfit; 17 } 18 }
参考资料:
http://www.cnblogs.com/springfor/p/3877059.html
LeetCode 题目列表 - LeetCode Questions List