前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构002:买卖股票的最佳时机

数据结构002:买卖股票的最佳时机

作者头像
艰默
修改2022-12-06 15:41:50
4540
修改2022-12-06 15:41:50
举报
文章被收录于专栏:iDoitnowiDoitnow

原文链接:数据结构002:买卖股票的最佳时机

题目

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0示例 1: 输入:7,1,5,3,6,4 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 示例 2: 输入:prices = 7,6,4,3,1 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

解题思路

结合题意,想获取高额回报,肯定是低买高卖,那我们首先想到的是找出数组中的最小值,当天买入,找出最大值,当天卖出,岂不美哉,但是两个字立马把我们拉回现实,如果数组的最大值在最小值前面呢,不就不符合实际情况了吗。那我们该怎么搞?突然想到这道题与我们之前的最大子数组和的内容有些类似,那解题思路是否类似呢?我们套用一下它的思路,找软柿子捏,先从短的数组开始分析(以{a, b, c, d, e}为例),既然要从短的数组分析,为了找出规律,我们将$f(i)$记为第$i$天卖出股票时的最大利润。那么,我们需要在0,i-1的范围内找到最小值minPrice_{[0,i)} ,则有f(i) = prices[i]-minPrice

  • i=0:题目要求当天买入,只能在未来的日子卖出。因此,无法在$i=0$处卖出,因此,最小值minPrice_{[0,0)} =0f(0)=0
  • i=1:这种只能i=0 处买入,$i=1$处卖出。最小值minPrice_{[0,1)} =max\{ a\}f(1)=b-minPrice
  • i=2:最小值minPrice_{[0,2)}=max\{ minPrice_{[0,1)}, b\}f(2)=c-minPrice
  • i=3:最小值minPrice_{[0,3)}=max\{ minPrice_{[0,2)}, c\}f(3)=d-minPrice
  • i=4:最小值minPrice_{[0,4)}=max\{ minPrice_{[0,3)}, d\}f(4)=e-minPrice

上面我们已经把prices = {a, b, c, d, e}中,第$i$天卖出股票的所有情况都列举出来了,那么要求一次交易获取的最大利润$maxProfit$就变得很简单了:

maxProfit=max\{f(0), f(1), f(2), f(3), f(4)\}

结合上面的分析,该问题的实现代码应该如下:

代码语言:c++
复制
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minPrice = numeric_limits<int>::max(); //将minPrice初始化为一个int型最大值,同时兼容i=0时的情况
        int maxProfit = 0;
        for (int price: prices) {
            maxProfit = max(maxProfit, price - minPrice);
            minPrice = min(price, minPrice); //对应minPrice[0,i)=max{minPrice[0,1-1), prices[i-1]}
        }
        return maxProfit;
    }
};

上述代码,只进行了一次循环,因此其时间复杂度为O(n) ,空间上,用了常数个变量,空间复杂度为O(1)

本文系转载,前往查看

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

本文系转载前往查看

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 解题思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档