小哆啦的股票奇遇记

166 阅读4分钟

小哆啦开始力扣每日一题的第五天

leetcode.cn/problems/be…

小哆啦的股票奇遇记


一天,晴空万里,小哆啦正在家里悠闲地喝着奶茶,突然,小胖——她的好友兼邻居——兴奋地冲进了她的房间,边跳边喊:“哆啦,快看,我在股市里赚了不少钱!我就说投资股票肯定能发财!”

小哆啦抬起头,眨了眨眼:“股市?那是什么东西?”她从来没接触过股票,听到这个词她还以为是炒菜的一种方法呢。

小胖苦笑了一下,拿出手机:“股市就是这种地方,你看看这个,我在这买了些股票,卖了又赚了一些。”小胖骄傲地展示着他的收益图表。

小哆啦一脸懵逼,但她立马决心:“如果小胖能赚,我也能赚!我要开始投资股票!”于是,小哆啦拿出她的小笔记本,开始准备自己的投资计划。


第一章:暴力求解

小哆啦并不着急去学习股票投资的深奥技巧,反而决定直接进入战斗——通过编程来“穷举”所有可能。她拿出她最拿手的 TypeScript 代码,开始编写一个暴力破解的程序。

她的策略很简单:每天都试着在每个可能的买入点和卖出点之间计算利润,然后选出最大的那个。这就像她在家里玩拼图,每次都要试试不同的组合来看看哪个拼法最完美。她心里想:“这样应该能找到最好的买卖时机!”

代码如下:

function maxProfit(prices: number[]): number {
    let maxProfit = 0;
    for (let i = 0; i < prices.length; i++) {
        for (let j = i + 1; j < prices.length; j++) {
            maxProfit = Math.max(maxProfit, prices[j] - prices[i]);
        }
    }
    return maxProfit;
}

小哆啦信心满满地运行了这个程序,结果……它成功计算出了最优利润,然而她惊讶地发现:随着股市数据越来越多,程序运行速度竟然越来越慢!她开始意识到,暴力解法虽然可以解决问题,但它效率低得让人头疼。

“呜呜,这样下去我可要变成‘傻哆啦’了!”小哆啦捧着头坐在沙发上。


第二章:小胖的神奇建议

就在小哆啦为自己的暴力算法而苦恼时,小胖又出现在了她的房间。小胖笑着对小哆啦说:“嘿,你的暴力解法很有意思,但这样效率太低了。我有个更聪明的办法,试试这个吧!”

小胖开始解释:“你有没有注意到,其实每当股票价格上升时,你就能赚取差价,而每次下降时你其实并不需要做任何操作。所以,你不需要穷举所有的买卖点,只要每次股票涨了,你就赚取这段涨幅就行了。”

小哆啦的眼睛亮了起来:“哦!原来我只需要赚股票的每次涨幅,而不是从每个点开始进行暴力计算!”她拿起笔记本,立刻开始重新设计代码。

她把暴力解法优化成了一个简单的贪心算法:每天,只要股价比前一天高,就“捡钱”!

优化后的代码如下:

function maxProfit(prices: number[]): number {
    let maxProfit = 0;
    for (let i = 1; i < prices.length; i++) {
        if (prices[i] > prices[i - 1]) {
            maxProfit += prices[i] - prices[i - 1]; // 累加上涨的部分
        }
    }
    return maxProfit;
}

第三章:大获成功!

小哆啦激动地运行了新的代码。程序运行得非常快,并且很快就得到了正确的最大利润!

她高兴得跳了起来:“哈哈!原来我根本不需要做那么多复杂的计算,直接累加每次上涨的部分就行了!”

从此以后,小哆啦开始每天都用她优化后的算法在股市中“捡钱”。她甚至学会了通过编程自动监控股市,轻松赚取利润。

有一天,小胖好奇地问:“哆啦,你到底是怎么做到的?我才刚刚学会一点股市知识,你怎么就能赚到这么多钱?”

小哆啦笑着摸了摸小胖的头:“哈哈,秘诀就是不停地优化!像你那样暴力地穷举,迟早会卡住。学会高效地解决问题,才能真正的轻松赚钱!”

小胖顿时明白了,原来程序员的思维这么厉害!


总结:

  1. 暴力解法:穷举每个买入和卖出的组合,计算利润,但效率很低(O(n^2))。
  2. 优化解法:通过累加股价上升的部分,使用贪心算法,高效解决问题(O(n))。

小哆啦从中学到了,不仅要做出解决方案,还要不断思考如何提高效率。