LeetCode——买卖股票的最佳时机(动态规划+更新极值)

简介: LeetCode——买卖股票的最佳时机(动态规划+更新极值)

题目描述

image.png

思路一:更新最大值和最小值

  • 首先,假设第一个元素是价格最小的值minPrice。
  • 定义一个价格最大差maxPriceDiff,并设置值为0。
  • 从数组的第二个元素开始更新价格最大差和最小值。
  • 最小值是在第i个元素和前面的最小值minPrice之间进行比较。
  • 最大价格差则是在前面的最大价格差和(第i天的股票价值-前面的最小值)之间进行比较。
  • 最后返回最大价格差。

AC代码

var maxProfit = function (prices) {
    // 通过不断更新最大值和最小值的方法来求解
    let maxPriceDiff = 0;
    let minPrice = prices[0];
    for (let i = 1; i < prices.length; i++) {
        minPrice = Math.min(prices[i], minPrice);
        let tempMax = Math.max(prices[i] - minPrice);
        maxPriceDiff = Math.max(maxPriceDiff, tempMax);
    }
    return maxPriceDiff;
};
复制代码

思路二:动态规划

详细的思路请看代码中的注释。 需要我们注意的是:本题中只能进行一次交易,例如如果你今天买入那么你手上的现金就是-prices[i]。

dp数组以及下标的含义

  • dp[i][0]:表示第i天,手里不持有股票的现金数
  • dp[i][1]:表示第i天,手里持有股票的现金数

AC代码

var maxProfit = function (prices) {
    // 通过动态规划的方法
    const dp = new Array(prices.length).fill([0, 0]);
    // 设置动态规划的初始值
    // 第0天不持股的情况下,手上的现金数
    dp[0][0] = 0;
    // 第1天持股的情况下,手上的现金数是当日价格的负数
    dp[0][1] = -prices[0];
    // 从第二天开始进行遍历
    for (let i = 1; i < prices.length; i++) {
        // 第i天手上不持股的情况:前一天不持股,或者前一天持股但是今天卖掉了
        dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
        // 第i天手上持股的情况:前一天不持股,今天买入,或者前一天持股今天没卖
        dp[i][1] = Math.max(- prices[i], dp[i - 1][1]);
    }
    // 最终返回的就是最后一天不持股手上的最大现金数
    return dp[prices.length - 1][0]
};
复制代码

题目反思

  • 学会使用动态规划来求解买卖股票的问题
  • 学会通过不断更新最大值和最小值的方法来求解这个问题。
  • 动态规划最重要的是理解dp数组及其下标的含义并准确列出动态规划的方程。
相关文章
|
4月前
|
算法 Python
【Leetcode刷题Python】309. 最佳买卖股票时机含冷冻期
解决LeetCode上309题“最佳买卖股票时机含冷冻期”的Python代码示例,利用动态规划方法计算在含有冷冻期约束下的最大利润。
45 1
|
4月前
|
算法 Python
【Leetcode刷题Python】121. 买卖股票的最佳时机
解决LeetCode上121题“买卖股票的最佳时机”的Python代码示例,采用一次遍历的方式寻找最佳买卖时机以获得最大利润。
64 1
|
4月前
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
66 0
|
4月前
|
算法 Python
【Leetcode刷题Python】714. 买卖股票的最佳时机含手续费
提供了两种解决买卖股票最佳时机含手续费问题的Python实现方法:贪心算法和动态规划算法。
49 0
|
4月前
|
算法 Python
【Leetcode刷题Python】122.买卖股票的最佳时机 II
LeetCode "买卖股票的最佳时机 II" 问题的Python代码实现,采用贪心算法在股票价格上升的每一天买入并卖出,以获得最大利润。
25 0
|
6月前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
55 0
|
6月前
|
存储
力扣每日一题 6/19 排序+动态规划
力扣每日一题 6/19 排序+动态规划
34 0
|
6月前
|
算法
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
48 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2