121.买卖股票的最佳时机

题目描述:

  给定一个数组 price ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

提示:  

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

 

解题思路:

  很容易想到,我们只要在最低价买进,最高价卖出便可以保证利润最大,但前提是保证最低价的买进日期在最高价的卖出日期之前,因此仅仅是找到数组的最大最小值是不够的。比如,对于数组[2,6,1,3,4],要是我们在价格为1的时候买进,那么我们只能在4的时候卖出获利3;而实际上我们可以在2买进6卖出获利4达到收益最大。

  我的想法是从后往前遍历,每次遍历到的元素作为买进的价格,然后从该元素往后寻找最高价maxOut,从而求出以价格in买进的最大获利profit=maxOut-preice[i],然后将以价格preice[i]买进的最大获利profit与历史最大获利ans相比较来更新ans。注意,从遍历元素往后寻找最高价的步骤并不需要增加一个for循环,因为所要寻找的最高价maxOut可以根据前一次循环得到的最高价maxOut与当前元素的下一个元素值进行比较得到(因为前一次循环并未将prices[i+1]这一价格作为卖出价格来决出最高卖出价格),即

maxOut = max(prices[i+1],maxOut)
 
复制代码
var maxProfit = function(prices) {
    var len = prices.length;
    var ans = 0;//初始化ans=0,表示最后一天同时买进卖出获益为0
    var maxOut = prices[len-1];//初始化表示此时卖出最高价为最后一个元素的值
    for(let i=len-2;i>=0;i--){//循环从倒数第二个元素开始,每次循环可以更新以price[i]买进时可以卖出的最高价maxOut,同时更新获益ans
        maxOut = Math.max(prices[i+1],maxOut);
        ans = Math.max(maxOut-prices[i],ans);
    }
    return ans;
};
复制代码

 

  后面看了leetcode的官方题解,好像与它的(方法二)一次遍历差不多,只不过人家从前往后遍历,而我是从后往前遍历。

posted @   ˙鲨鱼辣椒ゝ  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示