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的官方题解,好像与它的(方法二)一次遍历差不多,只不过人家从前往后遍历,而我是从后往前遍历。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix