题目
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出,
这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,
这笔交易所能获得利润 = 6-3 = 3 。
示例 2
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出,
这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解题思路
一开始确实把题目搞复杂化了,思考方向有些偏差,想的是优先取最大利润,所以以整个数组为维度,但忽略了交易的频次。比如[1,2,3,4,5]这个数组,题目给的示例是第一天买第五天卖,这样就需要循环遍历数组找出获取最大利润的买点和卖点。如果相同的方法放在示例1是不可行的。所以我结合了这两种示例,考虑使用贪心算法解决。
贪心算法是指在对问题求解时,总是做出在当前看来是最好(即最有利)的选择从而希望导致结果是最好或最优的算法。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。一般分为几步。
- 把求解的问题分成若干个子问题。
- 对每一子问题求解,得到子问题的局部最优解。
- 把子问题的解局部最优解合成原来解问题的一个解。
所以得出了一下算法
代码实现
class Solution {
public int maxProfit(int[] prices) {
int maxPro = 0, tmp = 0;
for (int i = 1; i < prices.length; ++i) {
tmp = prices[i] - prices[i-1];
if (tmp > 0)
maxPro += tmp;
}
return maxPro;
}
}
总结就是,只要第二天的价格比今天的高就卖掉,落袋为安。
不过,题外话。要是真的存在这种数组多好,那就可以知道未来几天的涨跌和买点卖点啦