LeetCode - 解题笔记 - 121 - Best Time to Buy and Sell Stock

Solution 1

整体来看感觉像是动态规划,但是由于整体的状态保留和利用十分简单,可以直接简化到贪心思路:

  1. 每一天的最大获利只会跟前面最小报价相关
  2. 当我们获得了一个更小的报价的时候,前面的历史最小报价

因此每遍历一天,需要检查两个情况即可:

  1. 当天收益是否为最大收益?
  2. 当前的报价是否是新的最低报价?(若是新的最低,当天必然不会是最大收益,一个if-else)

这样到最后就能获得最理想报价。由于数据无序,必须全部遍历。

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为输入序列的长度
  • 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int min_price = INT_MAX;
        int max_profit = 0;
        
        for (auto price: prices) {
            if (price < min_price) {
                min_price = price;
            } else if (price - min_price > max_profit) {
                max_profit = price - min_price;
            }
        }
        return max_profit;
    }
};

Solution 2

Solution 1的Python实现

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        min_price = None
        max_profit = 0
        
        for price in prices:
            if min_price is None or price < min_price:
                min_price = price
            elif price - min_price > max_profit:
                max_profit = price - min_price
                
        return max_profit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值