• 123. 买卖股票的最佳时机 III


    123. 买卖股票的最佳时机 III - 力扣(LeetCode)

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:

    输入:prices = [3,3,5,0,0,3,1,4]
    输出:6
    解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
         随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

    示例 2:

    输入:prices = [1,2,3,4,5]
    输出:4
    解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。   
         注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。   
         因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    

    示例 3:

    输入:prices = [7,6,4,3,1] 
    输出:0 
    解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

    示例 4:

    输入:prices = [1]
    输出:0
    

    提示:

    • 1 <= prices.length <= 105
    • 0 <= prices[i] <= 105

    思路

    核心算法是动态规划和滚动数组;

    1. int[]dp = new int[5];
    2. dp[0] = 0;
    3. dp[1] = -prices[0];
    4. dp[2] = 0;
    5. dp[3] = -prices[0];
    6. dp[4] = 0;

    首先是进行数据的初始化,这里的dp分别表示此时的操作状态,设置dp[0]是无操作时的状态,dp[1]是买入一次股票之后的状态,dp[2]是卖出第一次股票之后的状态,dp[3]第二次买入股票,dp[4]是第二次卖出股票;此时初始化的值的意思是,买入第一支股票之后又抛出;

    1. for (int i = 0; i < prices.length; i++) {
    2. dp[1] = max(dp[1],dp[0]-prices[i]);
    3. dp[2] = max(dp[2],dp[1]+prices[i]);
    4. dp[3] = max(dp[3],dp[2]-prices[i]);
    5. dp[4] = max(dp[4],dp[3]+prices[i]);
    6. }

    拿dp[1]的更新来说,dp[1]是买入第一支股票,那么就可以比较,是买入今天第一支股票(dp[0]-prices[i]),还是延续之前的状态(dp[1]),然后卖出第一支股票又是基于买入第一支股票,那么就可以判断dp[2]是要延续之前的状态还是就此卖出,以此类推;

    完整代码

    1. class Solution {
    2. public int maxProfit(int[] prices) {
    3. int[]dp = new int[5];
    4. dp[0] = 0;
    5. dp[1] = -prices[0];
    6. dp[2] = 0;
    7. dp[3] = -prices[0];
    8. dp[4] = 0;
    9. for (int i = 0; i < prices.length; i++) {
    10. dp[1] = max(dp[1],dp[0]-prices[i]);
    11. dp[2] = max(dp[2],dp[1]+prices[i]);
    12. dp[3] = max(dp[3],dp[2]-prices[i]);
    13. dp[4] = max(dp[4],dp[3]+prices[i]);
    14. }
    15. return max(dp[2],dp[4]);
    16. }
    17. public int max(int a,int b){
    18. return a>=b?a:b;
    19. }
    20. }

  • 相关阅读:
    PMD 检查java代码:方法和类的圈复杂度(CyclomaticComplexity )
    ROS 物体跟踪
    springboot校园疫情智慧防控微信小程序毕业设计源码011133
    laravel框架 - cache篇
    Python爬虫核心模块urllib的学习
    TS中的泛型精简(快速掌握)
    想画一张版权属于你的图吗?AI作画,你也可以
    Qt实现抽奖程序
    初级java每日一道面试题-2024年7月16日
    django学习笔记(一)
  • 原文地址:https://blog.csdn.net/qq_74455082/article/details/133513768