• 代码随想录补打卡 121买卖股票的最佳时机 122 买卖股票的最佳时机 二123买卖股票的最佳时机 三


    代码如下

    func maxProfit(prices []int) int { //建立一个二维数组 dp[i][0]表示持有股票的最大金钱 dp[i][1] 表示不持有股票的最大金钱 

            dp := make([][]int,len(prices))

            for i,_ := range dp {

                dp[i] = make([]int,2)

            }

            dp[0][0] = -prices[0]   // 第0天持有股票,则必须买入股票

            dp[0][1] = 0  //第0天不持有股票,则什么都不做,金额为0 

            for i := 1 ; i < len(prices) ; i++ {

                dp[i][0] = max(dp[i-1][0],-prices[i])      //如果在第i天持有股票,那么就有两种可能,一种是前一天持有股票,而今天什么都不做,那么他的金钱就是dp[i-1][0],或者是之前不持有,在第i天持有,那么金钱就是-prices[i] ,那么在这一天持有股票的最大值是两者的最大值

                dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i])  //如果在第i天不持有股票,同样有两种可能,一种是前一天就不持有股票,今天什么都没做,还有一种就是前一天是持有股票,今天把股票卖了出去

            }

            return max(dp[len(prices)-1][0],dp[len(prices)-1][1])

    }

    func max(a,b int) int {

        if a > b {

            return a 

        }else {

            return b 

        }

    }

    122   买卖股票的最佳时机二 

    代码如下

    func maxProfit(prices []int) int {

            dp := make([][]int,len(prices))

            for i,_ := range dp {

                dp[i] = make([]int,2)

            }

            dp[0][0] = -prices[0]

            dp[0][1] = 0 

            for i := 1 ; i < len(prices) ; i++ {

                dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]) 和上面唯一区别是,如果在第i天想要买入股票,那么金额应该是前一天不持有股票的金额减去今天这支股票的金额 

                dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i])

            }

            return max(dp[len(prices)-1][0],dp[len(prices)-1][1])

    }

    func max(a,b int) int {

        if a > b {

            return a 

        }else {

            return b 

        }

    }

    123 买卖股票的最佳时机3 

    代码如下

    func maxProfit(prices []int) int {

          dp := make([][]int,len(prices)) 

          for i ,_ := range dp {

              dp[i] = make([]int,5)

          }

          dp[0][0] = 0         //第一种状态为不操作,可以是不操作,也可以是在同一天买了又卖,也相当于不操作

          dp[0][1] = -prices[0]  //第二种状态为第一次持有,即持有第一次的股票。可以是买入一次股票,也可以是买入一次后一直持有。

          dp[0][2] = 0   // 第三种状态为第一次不持有,即把第一次持有的股票卖出去

          dp[0][3] = -prices[0]  //第四种状态为第二次持有,即持有第二次买入的股票

          dp[0][4] = 0  //第五种状态为第二次不持有,即把第二次持有的股票卖出

          for i := 1 ; i < len(prices) ; i++ {

              dp[i][0] = dp[i-1][0]   //如果第i天不操作,那么该与i-1天的值相同

              dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i])  // 如果第i天不进行买入操作,那么其结果等于第i-1天,如果进行买入操作,则相当于前一天不操作,第i天买入这支股票

              dp[i][2] = max(dp[i-1][2],dp[i-1][1]+prices[i]) // 如果第i天不进行卖出操作,那么这个值就等于前一天的值,如果进行卖出操作就相当于前一天是持有的状态,在加上把这支股票卖出

              dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]) //下面第二次持有的操作同第一次

              dp[i][4] = max(dp[i-1][4],dp[i-1][3]+prices[i])

          }

          return max(dp[len(prices)-1][2],dp[len(prices)-1][4])  //因为至多为2次,可能包含第二次怎么买都是亏得情况。所以比较卖出一次和两次的最大值 

    }

    func max(a,b int) int {

        if a > b {

            return a 

        }else {

            return b

        }

    }

  • 相关阅读:
    换个姿势做运维!GOPS 2022 · 深圳站精彩内容抢先看
    [MQ] 交换机与队列的介绍
    Redis1:Redis介绍、Redis基本特性、关系型数据库、非关系型数据库、数据库发展阶段
    【数据结构与算法】堆排序(向下和向上调整)、TOP-K问题(超详细解读)
    【线性代数 & C++】求逆矩阵
    Java前后端交互实现班级管理(查询)
    基于Java+Springboot+vue体育用品销售商城平台设计和实现
    Django多表查询
    网络安全深入学习第五课——热门框架漏洞(RCE— Apache Shiro 1.2.4反序列化漏洞)
    优化改进YOLOv5算法:加入ODConv+ConvNeXt提升小目标检测能力——(超详细)
  • 原文地址:https://blog.csdn.net/be_humbleman/article/details/130801612