LeetCode - 121 - 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)

栏目: IT技术 · 发布时间: 6年前

内容简介:LeetCode - 121 - 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)

Create by jsliang on 2019-7-1 08:37:50
Recently revised in 2019-7-1 09:15:08

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - 暴力破解 | |  3.2 解法 - 机遇求解 | |  3.3 解法 - 进一步思考 |

二 前言

  • 难度:简单

  • 涉及知识:数组、动态规划

  • 题目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

  • 题目内容

  1. 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

  2. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

  3. 注意你不能在买入股票前卖出股票。

  4. 示例 1:

  5. 输入: [7,1,5,3,6,4]

  6. 输出: 5

  7. 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5

  8. 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

  9. 示例 2:

  10. 输入: [7,6,4,3,1]

  11. 输出: 0

  12. 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 暴力破解

  • 解题代码

  1. var maxProfit = function(prices) {

  2. let max = 0;

  3. for (let i = 0; i < prices.length - 1; i++) {

  4. for (let j = i + 1; j < prices.length; j++) {

  5. let temp = prices[j] - prices[i];

  6. if (temp > max) {

  7. max = temp;

  8. }

  9. }

  10. }

  11. return max;

  12. };

  • 执行测试

  1. prices: [7,1,5,3,6,4]

  2. return: 5

  • LeetCode Submit

  1. Accepted

  2. 200/200 cases passed (432 ms)

  3. Your runtime beats 32.5 % of javascript submissions

  4. Your memory usage beats 81.63 % of javascript submissions (35.1 MB)

  • 解题思路

暴力一时爽,一直暴力一直爽

在一开始看到这道题的时候,jsliang 还小楞了一会,这题目有何意义?

股市是跌宕起伏的,谁都不知道买入的那一刻是不是最低时刻,卖出的那一刻是最高时刻。

只能说是相对于前面的历史而已,是相对最低和相对最高,然后……

咳咳,说多了,咱回头解题。

首先,咱聊聊题目的意思,大概是什么呢?

即:第 n + i 天的值大于第 n 天的值

[7, 1, 5, 3, 6, 4]

假设你第 1 天买的是 7,那么你需要找一个比 7 大的时机卖出,从而获取利益。

那么,毫无疑问, 6-1 的确是这串数组的最大求解。又或者是:

[5, 3, 6, 4]

那么, 6-3 就是最大求解。

然后,看出题意后,咱们进行暴力破解,无非就是双重 for 循环遍历,然后只要它有利润赚,我们就记录下,不停的查看是否破新高。

  1. for (let i = 0; i < prices.length - 1; i++) {

  2. for (let j = i + 1; j < prices.length; j++) {

  3. let temp = prices[j] - prices[i];

  4. if (temp > max) {

  5. max = temp;

  6. }

  7. }

  8. }

假设一开始是:[5,3,6,4]

那么,第一次循环的值,出来的 max6-5,即是 1。

最终得到的无非是 6-3,即是 3.

最后,我们再将 maxreturn 出去,就暴力突突了这道题。

3.2 解法 - 机遇求解

  • 解题代码

  1. var maxProfit = function(prices) {

  2. let min = Number.MAX_VALUE;

  3. let max = 0;

  4. for (let i = 0; i < prices.length; i++) {

  5. if (prices[i] < min) {

  6. min = prices[i];

  7. } else if (prices[i] - min > max) {

  8. max = prices[i] - min;

  9. }

  10. }

  11. return max;

  12. };

  • 执行测试

  1. prices: [7,1,5,3,6,4]

  2. return: 5

  • LeetCode Submit

  1. Accepted

  2. 200/200 cases passed (76 ms)

  3. Your runtime beats 97.33 % of javascript submissions

  4. Your memory usage beats 22.08 % of javascript submissions (35.8 MB)

  • 解题思路

这种解法,相对于暴力破解,也是挺有意思的。

它的思路是什么呢?

首先,我设置 min 为 JavaScript 的最大值,设置 max 为 0。

然后,我们开始思考,当前遍历的值,减去历史中出现的最小值,即是当前的利润。

[5, 3, 6, 4]

  1. 循环第 1 次。 min=5,当 prices[i] 为 6 的时候,产生正利润,所以该次循环的利润为 1

  2. 循环第 2 次。 min=3,当 prices[i] 为 6 的时候,产生的正利润为 3;当 prices[i] 为 4 的时候,产生的正利润为 1。因为有 max 记录最高值,所以本次最高利润为 3

  3. 循环第 3 次和第 4 次无正利润,忽略。

  4. 最终的正利润为 3,即 return3

  1. var maxProfit = function(prices) {

  2. let min = Number.MAX_VALUE;

  3. let max = 0;

  4. for (let i = 0; i < prices.length; i++) {

  5. if (prices[i] < min) {

  6. min = prices[i];

  7. } else if (prices[i] - min > max) {

  8. max = prices[i] - min;

  9. }

  10. }

  11. return max;

  12. };

最后,我们获取到了最高值,解题完毕。

3.3 解法 - 进一步思考

唯有菜鸡,才会正视别人的强大

jsliang 作为个菜鸡,就很喜欢膜拜大佬题解:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/yi-ge-fang-fa-tuan-mie-6-dao-gu-piao-wen-ti-by-l-3/

学习别人的思想,是件非常有意义的事情,毕竟智商就摆在那里,唯有从别人思想中获取到最大价值,你才能升华自己。


不折腾的前端,和咸鱼有什么区别!

LeetCode - 121 - 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

LeetCode - 121 - 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Math Adventures with Python

Math Adventures with Python

Peter Farrell / No Starch Press / 2018-11-13 / GBP 24.99

Learn math by getting creative with code! Use the Python programming language to transform learning high school-level math topics like algebra, geometry, trigonometry, and calculus! In Math Adventu......一起来看看 《Math Adventures with Python》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具