怎么才能在股市赚最多的钱???|刷题打卡

179 阅读3分钟

经历了困难算法的摧残,生无可恋的我直接找上了简单难度的题。 小样,我治不了你爷爷,我还治不了你?

一、先看题

给定一个数组 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。

提示:

  • 1<=prices.length<=1051 <= prices.length <= 10^5
  • 0<=prices[i]<=1040 <= prices[i] <= 10^4

原题链接:121. 买卖股票的最佳时机

二、整理思路

这难度就对了嘛,第一眼看过去就知道怎么做,遍历数组,然后一个一个对着后面的计算不就好了?

就在我要敲击键盘之际,突然第六感发出警告,冥冥之中有一股力量在阻止我点击提交键。

【按理来说我已经考虑到了没有交易完成的情况,并且测试用例也通过了,甚至还改了两个都没有问题,那么推理下来,真相只有一个!】

经过我的仔细观察,果然,LeetCode又把测试用例的长度拉到了10510^5,于是乎,在原本的暴力解法上进行了剪枝,得到了下面的答案:

/**
 * @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;
};

121. 买卖股票的最佳时机

三、总结

知识点:买卖股票算法

解题法:暴力法;思路优化

简单的题目往往也有最优解的思想,虽然在实现上可能没那么难,但是举一反三,熟悉了解题思路之后,对我们之后的解题也会有很大帮助。

解题其实重要的不是算出答案,而是刷通思路。

一起加油吧!

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情