122. 买卖股票的最佳时机 II js

题目描述:

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

解题思路:

  1. 一开始我想的是只要出现递减就重新开始计算买入的价格,但是实现的复杂了,后来代码一看其实就是只要涨了就不用管,比如:1,5,6 不用非得找到这个6减去1,用5减去1加上6减去1,实际上差值相加是一样的,只要是涨的。只要有的赚就都卖。
  2. 后来看到还可以用动态规划来计算,就是我今天只有两种情况,要么昨天价格比今天低,我马上卖掉,要么昨天价格比今天高,我不买,相当于今天赚了0块钱,到今天为止我总共的收益 =  我今天转的钱 + 我昨天赚的总的收益,所以dp 每一个元素都记录前一天的总的收益 + 今天赚的钱。

解法一:贪心算法

function maxProfit(prices) {
    let sum = 0
    for (let i = 1; i < prices.length; i++) {
        if (prices[i] > prices[i - 1]) {
            sum += prices[i] - prices[i - 1];
        }
    }
    return sum;
}

用时:

// 时间 68 ms 击败 72.46%

// 内存 42.5 MB 击败 92.17%

解法二:动态规划

function maxProfit(prices) {
    let dp = [0];
    for (let i = 1; i < prices.length; i++) {
        // 当天的收益
        let profit = prices[i] - prices[i-1] > 0 ? prices[i] - prices[i-1] : 0
        // 当天总的收益 = 前一天总的收益 + 今天的收益
        dp[i] = dp[i - 1] + profit;
    }
    return dp[prices.length - 1];
}

用时:

// Your runtime beats 87.83 % of typescript submissions

// Your memory usage beats 33.04 % of typescript submissions (44.3 MB)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值