所有股票题的通用解法参考链接:link
使用状态+选择的状态机方法。
状态:第几天(n),一共允许几次交易(k),目前手中是否持有股票(0,1)。n个状态就要做n-1次循环
选择:卖股票,不卖股票,不操作。每种状态可以从不同的选择得到。
假设有n天,最后返回的是第n天,第k次交易,没有股票的值,因为假设第n天还有股票,那么卖了所获得的收益肯定比不卖多。
通用状态转移方程:
1 | //第i天第k次交易时没有股票的状态可能从两种状态转移来,一种是第i-1天也没有股票,此时做的选择是不操作。一种是第i-1天有股票,此时做的操作是卖掉股票。 |
用这种通用做法重新做了一遍所有的股票题。
121. Best Time to Buy and Sell Stock
condition:If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
意味着k=1,将k=1代入通用状态转移方程。
1 | dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][1][1]+prices[i]) |
c++ code[8ms 11.8MB]
1 | class Solution { |
接下来简化空间,注意到dp[i]只和dp[i-1]相关,用一个变量记录一下。
c++ code[4ms 9.5MB]
1 | class Solution { |
122.Best Time to Buy and Sell Stock II
condition:Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
意味着k等于无穷大,将k等于∞代入通用状态转移
1 | dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i]) |
c++ code[8ms 9.5MB]
1 | class Solution { |
123. Best Time to Buy and Sell Stock III
condition: Design an algorithm to find the maximum profit. You may complete at most two transactions.
k=2,转移方程就是通用转移方程
1 | dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i]) |
这个时候该多加一重循环了
c++ code[40ms 18MB]
1 | class Solution { |
枚举k,就不用开数组了
c++ code[8ms 9.5MB]
1 | class Solution { |
188. Best Time to Buy and Sell Stock IV
condition:Design an algorithm to find the maximum profit. You may complete at most k transactions.
标准的k次交易,转换方程为:
1 | dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i]) |
c++ code[24MS 19.5mb]
1 | class Solution { |
当k>length/2的时候实际上是可以让你无限次交易的,因为一般来说length天最多交易length/2次。然后就可以直接用买股票II的算法,如果不加这个判断会mle,在k=10000000的时候:)
然后呢,看了讨论区,这个三维数组是可以用二维数组来替代的。
c++ code[4ms 9.2MB]
1 | class Solution { |
初始条件是因为对任何一个还没开始的交易,手中没有股票利润就是0,手中有股票是不合法的。k是倒着来的原因是dp[i][j][1]的时候要用到dp[i-1][j][1],要保证dp[i-1][j]1在dp[i][j][1]更新之前没有被更新过。