zoukankan      html  css  js  c++  java
  • [LeetCode] 309. Best Time to Buy and Sell Stock with Cooldown(买卖股票的最佳时机(带 CD 版))

    Description

    Say you have an array for which the ith element is the price of a given stock on day i.
    你有一个数组,第 i 个元素表示某只股票在第 i 天的售价

    Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:
    设计一个算法寻找这支股票的最大收益。你可以进行任意次交易(每次买卖 1 股,可进行多次),但需遵循以下限制:

    • You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
      你不能在同一天内进行多次交易(也就是说,你必须在买进下一股前把你的上一股卖出)。
    • After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)
      当你卖出股票后,第二天你不能买入股票。(也就是说,有 1 天的 CD)

    Example

    Input: [1,2,3,0,2]
    Output: 3 
    Explanation: transactions = [buy, sell, cooldown, buy, sell]
    

    Solution

    一开始没有啥思路,看到 discussion 里一个“基于状态机的 DP”后大概理解怎么做了,具体解法看下图(字渣见谅),代码如下:

    题解插图

    import kotlin.math.max
    
    class Solution {
        fun maxProfit(prices: IntArray): Int {
            val s0 = IntArray(prices.size)
            val s1 = IntArray(prices.size)
            val s2 = IntArray(prices.size)
    
            s0[0] = 0
            // 第 0 天买入股票
            s1[0] = -prices[0]
            // 第 0 天无法卖出,给个最小值吧
            s2[0] = Int.MIN_VALUE
    
            for (i in 1..prices.lastIndex) {
                s0[i] = max(s0[i - 1], s2[i - 1])
                s1[i] = max(s1[i - 1], s0[i - 1] - prices[i])
                s2[i] = s1[i - 1] + prices[i]
            }
    
            return max(s0.last(), s2.last())
        }
    }
    
  • 相关阅读:
    Spring Boot框架开发的Java项目在CentOS7上的部署
    linux系统文件被删的几种恢复方法
    网页跳转微信加好友的方法
    一键跳转微信加好友
    jmeter java性能测试
    jenkins jmeter持续集成批处理jmx脚本
    jmeter命令行运行-分布式测试
    jmeter之jtl文件解析
    jmeter命令行运行-单节点
    网络爬虫-获取infoq里的测试新闻保存至html
  • 原文地址:https://www.cnblogs.com/zhongju/p/14010169.html
Copyright © 2011-2022 走看看