每日算法【数组】 - 买卖股票的最佳时机 II

75 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

好好学习,天天刷题~~

今日份刷题记录如下:

image.png

解题思路一

由题目可以猜想,当天的利润其实只和前一天相关,在本题中因为我们能提前知道每一天股票的价格,所以我们只需要判断后一天的价钱是否比前一天的高,如果大于0,那么我们就可以买入,并将每次的收益记录下来。

1.首先要定义四个变量:买入的天数,买入的价格,总收益和是否买入的标志

2.当天的价格比前一天低,如果没有买入,则选择买入。如果买入了,则继续持有

3.当天的价格比前一天高,如果没有买入,则不买,如果买入了,则卖出

4.返回总收益

解法一

  var maxProfit = function(prices) {
     //定义变量买入的天数,买入的价格,总收益和是否买入的标志
     var day=0;price=0,sum=0,buy=false;
     while(day<prices.length){
         //当天的价格比前一天低,如果没有买入,则选择买入。如果买入了,则继续持有
         if(prices[day]<prices[day+1]){
             if(!buy){
                 price = prices[day] ;
                 buy=true;
             }
         }
         //当天的价格比前一天高,如果没有买入,则不买,如果买入了,则卖出
         else{
             if(buy){
                 buy=false;
                 sum+=prices[day] -price;
             }
         }
         day++;
     }
    return sum;
 };

解题思路二

实际上,本题可以使用贪心算法。当出现上涨时,就计算前后一天的差值,并对其进行累加。如果是出现下跌的情况,就不需要管。贪心算法其实就是指不需要考虑整体,只是做出当前看来的最好选择即可。

解法二

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

以上两种解法,最终执行的结果如下:

image.png