LeetCode算法练习(二) 买卖股票的最佳时机 II

前言:

继续我们的愉快算法练习之旅=。=

题目描述:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

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

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解题思路:

上一篇说过,解题之前应当准确的理解题意,我这一次又顺利的没有准确的理解=。=,那么就说一下我的解题思路吧。

我所理解的问题本质是,首先我们需要遍历数组,判断如下几种情况

1、如果还未买入,后一个值小于等于前一个那么买入,那么不是合适的买入时机,继续遍历
2、如果已经买入,后一个值小于等于前一个那么买入,是卖出的时机
3、如果还未买入,后一个值大于前一个那么买入,当前指针作为一个买入日期(这时要注意,需要判断是不是最后一天,是则在明天卖出,否则继续遍历。ps:我当时就漏掉了)
4、如果已经买入,后一个值大于前一个那么买入,那么判断是不是最后一天,是则卖出,否则继续遍历 

据此我的代码是:

let currentPrice=null;//当前股价
let nextPrice=null;//明天股价
let buyPrice=null;//买入股价
let salePrice=null;//卖出股价
let sum=0;
for(let i=0;i<nums.length-1;i++){
    currentPrice=nums[i];
    nextPrice=nums[i+1];
    /*如果还没有买入并且明天股价低于或等于今天,那么不买入也不卖出*/
    if(currentPrice>=nextPrice&&buyPrice==null){
        /*到最后一天仍然没有(再次)买入的时机*/
        if(i===nums.length-2){
            console.log("行情不好,不买了)")
        }
    }
    /*如果已经买入并且明天股价低于或等于今天,那么卖出*/
    else if(currentPrice>=nextPrice&&buyPrice!=null){
        /*卖出时机*/
        salePrice=currentPrice;
        sum+=(salePrice-buyPrice);
        buyPrice=null;
    }
    /*如果没有买入并且明天股价高于今天,那么买入*/
    else if(currentPrice<nextPrice&&buyPrice==null){
        /*买入*/
        buyPrice=currentPrice;
        if(i===nums.length-2){
            /*卖出时机*/
            salePrice=nextPrice;
            sum+=(salePrice-buyPrice);
            buyPrice=null;
        }
    }
    /*如果已经买入并且明天股价高于今天,那么判断日期(当前指针)*/
    else if(currentPrice<nextPrice&&buyPrice!=null){
        /*还有升价的机会仍然要在明天卖出的时机,因为后天股市爆炸了(数组到头了)=。=*/
         if(i===nums.length-2){
             /*卖出时机*/
             salePrice=nextPrice;
             sum+=(salePrice-buyPrice);
             buyPrice=null;
         }
    }
}
console.log(sum);

注释非常详细,代码就不在详细讲了。

其他思路:

提交答案成功通过后照常去看了其他同学的代码,结果发现代码甚是简洁。代码如下:

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let profit = 0;

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

明天比今天高就买入,并在第二天卖出,依次类推即可...

我的错误理解是,认为必须在买入后的最高价卖出,即我的程序结果实际上是使用最少的交易次数获取最多的利润,并且可以输入买入和卖出的实时间(虽然是多余的操作=。=)。 

总结:

总结是什么呢,买股票不是要等到最高价再卖出才能获得最高的利润=。=,昨天买了,今天涨了,那么就可以马上卖出了,然后再买入,涨价再卖出,如此反复,积少成多。与等到最高价卖出获得的利润是一样一样的(不嫌麻烦的话)。

再就是准确的理解题意,拿到问题(需求)后,一定要仔细找最优解,很重要=。=!!!

发布了49 篇原创文章 · 获赞 19 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_33718648/article/details/96458885