LeetCode 121.——贪心算法

本文介绍了一种利用贪心算法解决股票交易问题的方法,通过维护到目前为止的最低股票价格,并计算每日抛售股票的最大收益,最终得到最大总收益。代码实现中,遍历股票价格数组,更新最低价格和当前最大收益,循环结束后返回最大收益。时间复杂度为O(N),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目概述:

在这里插入图片描述
题目链接:点我做题

一、贪心算法

  不妨这样思考,最高的总收益值由以下集合的中的最大值决定:
{ x ∣ x = 第 i 天 抛 售 股 票 能 带 来 的 最 大 收 益 值 } \left\{ x|x = 第i天抛售股票能带来的最大收益值 \right\} {xx=i}
  那第i天抛售股票能带来的最大收益值怎么计算呢?可以由以下公式计算:
第 i 天 抛 售 股 票 能 带 来 的 最 大 收 益 值 = 当 天 的 股 票 价 格 − 到 第 i 天 为 止 ( 包 括 第 i 天 ) 最 低 的 股 票 价 格 ( 作 为 买 入 价 格 ) 第i天抛售股票能带来的最大收益值 \\=当天的股票价格-\\到第i天为止(包括第i天)最低的股票价格(作为买入价格) i=i(i)()
  我们定义 m i n i p r i c e miniprice miniprice表示到到第i天为止(包括第i天)最低的股票价格,定义 m a x p r o f i t maxprofit maxprofit作为随着循环不断更新最大值的最大收益值,定义 c u r p r o f i t curprofit curprofit作为第i天抛售股票能带来的最大收益值,显然可以在同一趟循环中先更新 m i n i p r i c e miniprice miniprice(用之前的 m i n i p r i c e miniprice miniprice和今日的价格对比),再计算 c u r p r o f i t curprofit curprofit(用当日的价格 p r i c e s [ i ] − m i n i p r i c e prices[i]-miniprice prices[i]miniprice),再更新 m a x p r o f i t maxprofit maxprofit(用 c u r p r o f i t curprofit curprofit和第i-1天的 m a x p r o f i t maxprofit maxprofit取大),最后循环结束,返回 m a x p r o f i t maxprofit maxprofit
  巧妙的是,如果当天就是股票最低值,就会使得当天抛售的最大利润 c u r p r o f i t curprofit curprofit就是0,与我们的题意不谋而合。
代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
        int len = prices.size();
        if (len == 1)
        {
            return 0;
        }
        int maxprofit = 0;
        int curprofit = 0;
        int miniprice = INT_MAX;
        for (int i = 0; i < len; i++)
        {
            if (prices[i] < miniprice)
            {
                miniprice = prices[i];
            }
            curprofit = prices[i] - miniprice;
            if (curprofit > maxprofit)
            {
                maxprofit = curprofit;
            }
        }
        return maxprofit;
    }
};

时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值