js算法买卖股票的最佳时机入门

涉及力扣题目:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值