前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指Offer题解 - Day18

剑指Offer题解 - Day18

作者头像
chuckQu
发布2022-08-19 10:50:58
1670
发布2022-08-19 10:50:58
举报
文章被收录于专栏:前端F2E

「剑指 Offer 63. 股票的最大利润」

力扣题目链接[1]

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 1:

代码语言:javascript
复制
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

代码语言:javascript
复制
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

「限制:」

0 <= 数组长度 <= 10^5

思路:

假如采用暴力法求解,那么根据题目描述,可以得出交易方案数一共有:

(n−1)+(n−2)+⋯+2+1=n(n−1)/2 种,时间复杂度为O(n^2) ,因此该方法不考虑。

本题可应采用动态规划的方式进行求解。首先,需要归纳出动态规划的方程。可以得出以下结论:

  • 假设f(n)代表前n日的最大利润。
  • f(0) = 0,也就是说首天的利润是0
  • 那么,f(n)就等于前n - 1日的利润和第n日卖出利润的最大值。
  • f(n) = max(f(n - 1), (prices[n] - min([0, n))))

解释一下动态规划方程:

n日的最大利润,就是比较前n - 1日的利润,第n日的卖出利润的最大值。而第n日的卖出利润就是当天的股票价格减去前面n天的最低价格。

根据以上分析,可以得出以下代码:

动态规划

代码语言:javascript
复制
/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let max = 0;
    for (let i = 0; i < prices.length; i++) {
        max = Math.max(max, (prices[i] - Math.min(...prices.slice(0,i))))
    }
    return max;
};
  • 「时间复杂度 O(n^2)」
  • 「空间复杂度 O(1)」

分析:

通过代码实现出动态规划方程,在力扣里执行代码并提交是可以通过的,但是效率特别的低。会发现比较耗时的代码是计算前 n 天的最小值,时间复杂度是O(n)。而外层嵌套有循环,因此降低了执行效率。

所以,我们需要通过维护额外的变量进行统计前n天的最小值,而不要每次都动态计算。

动态规划优化

代码语言:javascript
复制
/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let value = 0;
    let price = +Infinity; // 初始化无穷大,方便后续比较较小值
    for (let i = 0; i < prices.length; i++) {
        price = Math.min(price, prices[i]); // 将上次比较的最小值与当前值比较,获取最新最小值
        value = Math.max(value, (prices[i] - price)) // 动态规划方程
    }
    return value;
};
  • 「时间复杂度 O(n)」
  • 「空间复杂度 O(1)」

分析:

我们动态的缓存最新的最小值,避免了每次取prices[i]以前所有的值进行比较。如此优化,可以将时间复杂度降低至O(n)

总结

本题的难点在于动态规划方程的归纳,以及动态的缓存最小值。

可以得出一个通用的法则:当需要获取最小值时,初始化的变量赋值为+Infinity ,方便比较出最小值;反过来的话,就需要将初始化的变量赋值为-Infinity ,方便比较出最大值。

参考资料

[1]力扣题目链接: https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/58nn7r/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 「剑指 Offer 63. 股票的最大利润」
    • 动态规划
      • 动态规划优化
        • 总结
          • 参考资料
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档