涉及力扣题目:
121.买卖股票的最佳时机
122.买卖股票的最佳时机II
123.买卖股票的最佳时机III
买卖股票是算法中动态规划专题里很经典的题目,它的难度包括简单到困难,但是它们的解题思路只要使用动态规划那就是一模一样没有区别,这也意味着掌握关键的算法套路很重要。
我们先来看一道入门题:
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
跟据前一天的收益获取今天的收益,很经典的动态规划套路。这是一道简单题对于回溯算法来解决确实是一道简单题,但是使用动态规划反而要更难这是因为,我们需要对其进行dp数组含义进行抽象这在动态规划中往往是最难的。
那我们开始进行第一也是最难的一步,创建一个二维数组,一维下标表示天数,二维下标为0就是表示要进行持有股票的操作,下标为2就是不持有股票操作,二维数组的大小就是收益。那么问题来了,假设我们知道前面天数的最大收益如何求当今收益,接下来就来到了推导公式,获取当今收益无非两种情况。1 今天啥也没做,直接就是前一天的收益dp[i-1]【0】(毕竟什么也不做也算是持有股票)或者直接买入一支新的股票0-prices[i]. 2 今天啥也不做dp[i-1][1],卖出股票dp[i-1][0]+proces[i].
对于初始化,就比较简单,直接假设当天的两种唯一情况。
dp[0] = [-prices[0], 0];
其余数组全设为0即可。
完整代码:
const maxProfit = prices => {
const len = prices.length;
// 创建dp数组
const dp = new Array(len).fill([0, 0]);
// dp数组初始化,一种是直接买股票,一种是不持有股票
dp[0] = [-prices[0], 0];
for (let i = 1; i < len; i++) {
// 更新dp[i]
dp[i] = [
Math.max(dp[i - 1][0