原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12148390.html
给定一个数组,它的第 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。
public static int maxProfit(int[] prices) { /** * 持有股票的价格 * 此处不设为0是因为题目允许股票价格为0,这事实上是不允许的,不过还是照着题目要求干吧 */ int hold = -1; /** * 利润 */ int profit = 0; for (int i = 0; i < prices.length; i++) { /** * 如果第i天价格大于第i+1天,那么就查看持股数是否大于等于0 * 如果持股数大于等于0那么就可以出手了,出手后持股数恢复初始设置 * 没有持股数就开始下一轮循环,看看下一天的股票价格如何 */ if ((i + 1 < prices.length) && prices[i] > prices[i + 1]) { if (hold >= 0) { profit += prices[i] - hold; hold = -1; } else { continue; } } else { /** * 如果第i天价格不大于第i+1天的价格,那么就可以买入了 */ if (hold >= 0 ) { /** * 如果持有股 * 则继续保持,不抛,进入下一轮循环 */ if (i + 1 == prices.length) { /** * 此处是一个临界条件 * 如果i是最后一天 * 那就赶紧抛 */ profit += prices[i] - hold; return profit; } continue; } else { /** * 如果没有持有股就买入 */ hold += prices[i] + 1; } } } return profit; }