目录
总结
121.买卖股票的最佳时机
问题描述
特点分析
动态规划思路
122.买卖股票的最佳时机Ⅱ
问题描述
特点分析
动态规划思路
123.买卖股票的最佳时机III
问题描述
特点分析
动态规划思路
188.买卖股票的最佳时机IV
问题描述
特点分析
动态规划思路
309.最佳买卖股票时机含冷冻期
问题描述
特点分析
动态规划思路
714.买卖股票的最佳时机含手续费
问题描述
特点分析
动态规划思路
0、题目描述
122. 买卖股票的最佳时机 II 可以买卖多次
123. 买卖股票的最佳时机 III 最多买卖 2 次
188. 买卖股票的最佳时机 IV 最多买卖 k 次
309. 最佳买卖股票时机含冷冻期 可以买卖多次,含冷冻期
714. 买卖股票的最佳时机含手续费 可以多次买卖,含手续费
1、dp数组的含义
2、递推公式
3、初始化
4、遍历方式
5、获取结果
题目链接:力扣
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
dp[i][j] 表示在第 i 天,如果是状态 j , 手中的现金最大值为 dp[i][j],默认一开始手中的现金为0
状态分析
第 i 天有两种状态:持有股票、未持有股票
初始化
获取结果
题目链接:力扣
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
只能持有一只股票,可以买卖多次
可以贪心算法,只要能获利进行买卖
可以动态规划
dp[i][j] 表示在第 i 天,如果是状态 j , 手中的现金最大值为 dp[i][j],默认一开始手中的现金为0
这道题目,第 i 天有两种状态:持有股票、未持有股票,和 121. 买卖股票的最佳时机 是一样的,不一样的是递推公式
先看,只可以买卖一次的递推公式
只买卖一次,有两种状态
第 i 天持有股票
情况一:前一天已经持有股票,dp[i][0] = dp[i - 1][0]
情况二:前一天未持有股票股票,dp[i][0] = -prices[i]
第 i 天未持有股票
情况一:前一天已经是未持有状态,dp[i][1] = dp[i - 1][1]
情况二:前一天还是持有股票状态,dp[i][1] = dp[i][0] + prices[i]
再看,可以买卖多次的递推公式
可以买卖多次,有两种状态
第 i 天持有股票
情况一:前一天已经持有股票,dp[i][0] = dp[i - 1][0]
情况二:前一天未持有股票股票,dp[i][0] = dp[i - 1][1] - prices[i]
第 i 天未持有股票
情况一:前一天已经是未持有状态,dp[i][1] = dp[i - 1][1]
情况二:前一天还是持有股票状态,dp[i][1] = dp[i][0] + prices[i]
这里和121. 买卖股票的最佳时机唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况。
因为买卖股票的时候,可能已经出现前面获得利润的情况,不能从 0 开始买股票了,而是用前一天未持有股票的时候有的钱来买,这样才能将将前面的结果也进行累加
题目链接:力扣
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
dp[i][j] 表示在第 i 天,如果是状态 j , 手中的现金最大值为 dp[i][j],默认一开始手中的现金为0
状态分析
第 i 天有五种状态:但是也是主要分为持有股票和未持有股票,还有一个状态是没有操作
其中没有操作状态其实只用了一次,可以忽略,但是从下标 1 开始分析,更加方便,这样做最多 k 次买卖的时候也更加方便
初始化
获取结果
题目链接:力扣
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
状态分析
for (int j = 0; j < 2 * k - 1; j += 2) {dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
}
初始化
获取结果
题目链接:力扣
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
dp[i][j] 表示在第 i 天,如果是状态 j , 手中的现金最大值为 dp[i][j],默认一开始手中的现金为0
状态分析
第 i 天有五种状态:可以分为 持有股票状态 和 未持有股票状态
初始化
获取结果
题目链接:力扣
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
与122. 买卖股票的最佳时机 II 原理一样,只需要再卖出时付手续费就可以