买卖股票的最佳时机(第8题)

109 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

菜鸟就要从第8题继续

一、题目描述:

给定一个数组prices,其中prices[i]表示股票第 i 天的价格。 在每一天,你可能会决定购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以购买它,然后在同一天出售。返回你能获得的最大利润 。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

第一版:直观上理解,买入的时候应该是后一天比当天涨,且当天手里没有股票,卖出时应该是后一天比当天跌,且手里有股票(或者是最后一天,这个条件第一次写没考虑到)

实际这道题求的就是上升段一共有多高,因此采用贪心算法,只要计算后一天与当天的差值,大于0就累加进去即可,贪心计算简单,代码清晰,但并没有体现实际的购买方式。

这道题还可以采用动态规划的思路求解,但逻辑就要复杂的多,空间占用也比较多。通过两个数分别代表前一天是否拥有股票的最大收益,就可以从开始推求到最后一天卖掉股票的最大收益。

直观虽然代码复杂,但可以很清晰的获取是哪一天买入哪一天卖出,计算和空间也很不错。但贪心的代码就更清爽。而动态规划也有响应的算法思想。虽然题简单,但思想更重要。

三、AC 代码:

1、第一版

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    const n =prices.length
    let shares =0
    let buy =0
    let sell =0
    let result =0
    for(let i=0;i<n;i++){
        if(prices[i]<=prices[i+1]&&shares ==0){
            buy=prices[i]
            shares=1
        }
        else if((prices[i]>=prices[i+1]||i==n-1)&&shares ==1){
            sell=prices[i]
            shares=0
            result=result+sell-buy
        }
    }
    return result
};

2、贪心

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    const n =prices.length
    let result =0
    for(let i=0;i<n-1;i++){
        result += Math.max(prices[i + 1] - prices[i], 0);
    }
    return result
};

3、动态规划

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    const n = prices.length;
    let dp0 = 0, dp1 = -prices[0];
    for (let i = 1; i < n; ++i) {
        let newDp0 = Math.max(dp0, dp1 + prices[i]);
        let newDp1 = Math.max(dp1, dp0 - prices[i]);
        dp0 = newDp0;
        dp1 = newDp1;
    }
    return dp0;
};