给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例 1:
输入:prices = [7,1,5,3,6,4] 输出:7 解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。 最大总利润为 4 + 3 = 7 。
示例 2:
输入:prices = [1,2,3,4,5] 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。 最大总利润为 4 。
示例 3:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。
解题思路:这题和昨天的买卖股票的最佳时机一题很类似,只是在此基础上,增加了需求,从只能买一次股票变成可以多次购买实现利润最大化。
以下是 时间复杂度O(n),空间复杂度 O(1)算法的步骤:
1.初始化 min_price 为第一个元素,即第一天的股票价格。
2.初始化 max_profit 为 0。
3.从第二天开始遍历数组 prices:
(1)对于每个价格 prices[i],计算如果今天卖出的利润:profit = prices[i] - min_price。
(2)如果 profit 大于 0,则更新 max_profit,同时更新min_price令其等于prices[i],以便进行下 一轮的买股,卖股。
(3)如果 prices[i] 小于 min_price,则更新 min_price。
4.返回 max_profit。
public int maxProfit(int[] prices) { int min_price=prices[0]; //记录最小价格 int max_profit=0;//记录最大利润值 for (int i = 1; i < prices.length ; i++) { //计算利润 int profit=prices[i]-min_price; //是否为正利润,为正利润则更新 if (profit>0){ max_profit += profit; //min_price 前移,让其等于当前指针的值 min_price=prices[i]; } //更新最小价格 if(min_price>prices[i]){ min_price=prices[i]; } } return max_profit; } 思考:如果用昨天所说的买卖股票的最佳时机一题中所补充的Math.max和Math.min函数如何实现本题解题呢?
贪心算法的核心思想是,如果今天的价格比昨天高,就卖出昨天买入的股票。
maxProfit 为 0。prices,对于每一天 i(从1到数组末尾): 如果 prices[i] > prices[i - 1],则表示今天的价格比昨天高,可以卖出昨天买入的股票,获得利润 prices[i] - prices[i - 1],并将这个利润加到 maxProfit 上。public int maxProfit(int[] prices) { int maxProfit = 0; for (int i = 1; i < prices.length; i++) { // 如果今天的价格比昨天高,就卖出股票 if (prices[i] > prices[i - 1]) { maxProfit += prices[i] - prices[i - 1]; } } return maxProfit; } 这段代码的时间复杂度是 O(n),其中 n 是数组 prices 的长度。这种方法简单且高效,适用于这个问题。在实际应用中,这种方法通常能够获得很好的结果,尤其是当股票价格波动较大时。
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。这种算法不保证会得到最优解,但在某些情况下,贪心算法的解足够接近最优解或者确实是最优解。