经历了困难算法的摧残,生无可恋的我直接找上了简单难度的题。
小样,我治不了你爷爷,我还治不了你?
一、先看题
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价>格;同时,你不能在买入前卖出股票。
示例2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
原题链接:121. 买卖股票的最佳时机
二、整理思路
这难度就对了嘛,第一眼看过去就知道怎么做,遍历数组,然后一个一个对着后面的计算不就好了?
就在我要敲击键盘之际,突然第六感发出警告,冥冥之中有一股力量在阻止我点击提交键。
【按理来说我已经考虑到了没有交易完成的情况,并且测试用例也通过了,甚至还改了两个都没有问题,那么推理下来,真相只有一个!】
经过我的仔细观察,果然,LeetCode又把测试用例的长度拉到了,于是乎,在原本的暴力解法上进行了剪枝,得到了下面的答案:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let res = 0
for(let i=0;i<prices.length;i++){
let bigger=prices[i];
for(let j=i+1;j<prices.length;j++){
//通过判断来跳过无意义的计算
if(bigger<prices[j]){
bigger=prices[j]
}
}
if(bigger-prices[i]>res){
res=bigger-prices[i]
}
}
return res
};
提交之后堪堪过了测试用例,用时上只打败了5%-10%左右的人。 这我肯定不能满足啊,这么没有含金量的解法,毫无成就感和进步感可言,就算是一个简单的题目,咱也要尽量找最优解,这样精益求精才是王道。
于是乎,又一次经历了 思考 ---> 怀疑人生 ---> 参考答案--->思考。。。的过程之后,恍然大悟,就是嘛,自己真是傻了:
var maxProfit = function(prices) {
let minprice = Number.MAX_VALUE;
let maxprofit = 0;
//记录下当前为止最小的值和最大的利润
for (const price of prices) {
maxprofit = Math.max(price - minprice, maxprofit);
minprice = Math.min(price, minprice);
}
return maxprofit;
};
三、总结
知识点:买卖股票算法
解题法:暴力法;思路优化
简单的题目往往也有最优解的思想,虽然在实现上可能没那么难,但是举一反三,熟悉了解题思路之后,对我们之后的解题也会有很大帮助。
解题其实重要的不是算出答案,而是刷通思路。
一起加油吧!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情