题目描述:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

解题思路:

一道经典动态规划启蒙题,虽然用贪心空间复杂度更简单且容易理解,但 dp 才是这个题以及这题的后续几个股票问题的归宿。

用 dp 自然就需要 dp 数组及其递推公式,此处的 dp[i][0] 可以表示当前持有股票的买入时的花费,按照题目理解,买入花费的当然是越低越好,则 dp[i][0] 则有两种取法。一是第 i 天当天买入,则 dp[i][0] = -prices[i] (因为是买入所以是负数),二是第 i 天的前一天已买入(是已买入而不一定是前一天买入的)。即 dp[i][0] 为当天及当前之前的股票的最低价。递推公式为:

而 dp[i][1] 则表示第 i 天当天没有持有股票手上的最多现金,且初始现金为 0 .这就会有三种情况。一是还没有买过股票,则此时 dp[i][1] = 0. 二是第 i 天当天卖出股票,则收益为当天股票的股价 - 股票买入价,而最低买入价可以从 dp[i-1][0] 得到,所以此时 dp[i][1] = prices[i] + dp[i-1][0]。三是第 i 天之前就卖出了股票(不一定是第 i-1 天卖出的),此时 dp[i][1] = dp[i-1][1]。此处同样取最大值,即递推公式为:

初始化:第一天没有前一天,只能当天买入股票,所以 dp[0][0] = -prices[0]。第一天也无法卖出股票,所以 dp[0][1] = 0。

举个栗子:

输入:[7,1,5,3,6,4]
输出:5
  1. 第一天只能买入不能卖出,所以 dp[0][0] = 7,dp[0][1] = 0。
  2. 第二天买入价为 1 小于之前的 7 ,更新。若今天卖出,则收益为 1-dp[0][0] < dp[0][1]。所以 dp[1][0] = 1,dp[1][1] = 0。
  3. 第三天买入价为 5 大于之前的 1 ,不变。若今天卖出,则收益为 5-dp[1][0] > dp[1][1]。所以 dp[2][0] = 1,dp[2][1] = 4。
  4. 第四天买入价为 3 大于之前的 1 ,不变。若今天卖出,则收益为 3-dp[2][0] < dp[2][1]。所以 dp[3][0] = 1,dp[3][1] = 4。
  5. 第五天买入价为 6 大于之前的 1 ,不变。若今天卖出,则收益为 6-dp[3][0] > dp[3][1]。所以 dp[4][0] = 1,dp[4][1] = 5。
  6. 第六天买入价为 4 大于之前的 1 ,不变。若今天卖出,则收益为 4-dp[4][0] < dp[4][1]。所以 dp[4][0] = 1,dp[4][1] = 5。

最大利润即为 5.

完整代码:

/*** @param {number[]} prices* @return {number}*/
var maxProfit = function(prices) {var len=prices.length;const dp=new Array(len).fill([0,0]);dp[0][0]-=prices[0];dp[0][1]=0;for(var i=1;i<len;i++){dp[i]=[Math.max(dp[i-1][0],-prices[i]),Math.max(dp[i-1][1],prices[i] + dp[i-1][0])]}return dp[len-1][1];
};

 欢迎指正!

JavaScript 每日一题---LeetCode 121. 买卖股票的最佳时机相关推荐

  1. 《LeetCode刷题》—121. 买卖股票的最佳时机

    <LeetCode刷题>-121. 买卖股票的最佳时机 一.题目内容 原题连接:https://leetcode.cn/problems/best-time-to-buy-and-sell ...

  2. LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划

    LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...

  3. leetcode - 121.买卖股票的最佳时机

    121.买卖股票的最佳时机 ------------------------------------------ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成 ...

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

    文章目录 121. 买卖股票的最佳时机 代码与思路 暴力法 一次遍历 单调栈 122. 买卖股票的最佳时机 II 代码与思路 股票问题系列通解 121. 买卖股票的最佳时机 给定一个数组,它的第 i ...

  5. LeetCode - 121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.leng ...

  6. LeetCode 121:买卖股票的最佳时机 思考分析

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票 ...

  7. 力扣刷题day42|121买卖股票的最佳时机、122买卖股票的最佳时机II

    文章目录 121. 买卖股票的最佳时机 贪心思路 动态规划思路 动态规划五部曲 122. 买卖股票的最佳时机II 贪心思路 动态规划思路 动态规划五部曲 121. 买卖股票的最佳时机 力扣题目链接 给 ...

  8. 【LeetCode每日一题】——714.买卖股票的最佳时机含手续费

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[题目提示] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 贪心算法 二[ ...

  9. 105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)

    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来 ...

  10. leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针

    贪心的思路: 得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的 class Solution { public:int maxProfit(vector<int>& p ...

最新文章

  1. C语言memmove()函数: 复制内存内容(可以重叠的内存块)
  2. 从零开始搭建物联网平台(6):消息的持久化
  3. bzoj 2119 股市的预测 —— 枚举关键点+后缀数组
  4. ssh证书登录(实例详解)
  5. leetcode35 C++ 4ms 搜索插入位置
  6. memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
  7. [PyTorch] 记录一次PyTorch版本更新
  8. Flink 1.11 SQL 使用攻略
  9. atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria
  10. 数据库课程设计实验报告--图书管理系统
  11. 优秀程序员 分析提高能力 程序进阶
  12. 计算机主板图解内存插槽,图解电脑主板上的常见部件 -电脑资料
  13. 数据库字段数据(昵称)排序,规则: 数字英文字母汉字首字母 兼容简繁体排序
  14. 互联网日报 | 1月27日 星期三 | 支付宝集五福活动2月1日开启;华为否认“出售手机业务”传闻;中国联通自有手机品牌发布...
  15. echarts 实现区域划分 折线图
  16. 电子与计算机工程导论,BGPLUS科研荟萃 | 杜克大学 | 电子工程、计算机工程:电子与计算机工程导论...
  17. 移动开发的软件开发生命周期介绍(二)
  18. 零基础学习微信小程序(7):组件
  19. protobuf repeated数组类型的使用
  20. 华为云OBS文件服务

热门文章

  1. EPP-常见问题总结
  2. Lab、RGB、CMY、HSV、HSL
  3. 解读Verizon 2018数据泄漏调查报告:窃取身份仍是黑客最有效的攻击手段
  4. ZZULIOJ:1138: C语言合法标识符
  5. genymotion报错an error occured while deploying the file解决办法
  6. 【83行代码获奖代码】高中生@青藤木子 耗费一周给妈妈编写了一款语音识别APP
  7. java公倍数_java中如何计算最小公倍数
  8. endl 和 cout
  9. jackson解析泛型的正确写法,解决 in unnamed module of loader ‘app‘
  10. 数据挖掘中的模式发现(七)GSP算法、SPADE算法、PrefixSpan算法