121. 买卖股票的最佳时机

博客围绕计算股票最大利润问题展开,给定数组表示股票每天价格,最多完成一笔交易。介绍了两种算法,分治法将数组分左右两部分,考虑三种情况求最大利润,时间复杂度O(nlogn);动态规划通过状态转移方程求解,时间复杂度O(n)。

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

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。

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

示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

1.分治法:将数组分成左右两部分,最大利润有3种情况,第一种在左侧,第二种在右侧,第三种是横跨左右两部分,即最小买入在左侧,最大卖出在右侧。计算三种情况的最大利润,输出最大的结果。时间复杂度为O(nlogn)

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        length=len(prices)
        if length==0:
            return 0
        return self.divide(prices,0,length-1)
    def divide(self, prices, s, t):
        if s==t:
            return 0
        mid=(s+t)//2
        lmin=prices[s]
        for i in range(s,mid+1):
            if prices[i]<lmin:
                lmin=prices[i]
        rmax=prices[mid+1]
        for i in range(mid,t+1):
            if prices[i]>rmax:
                rmax=prices[i]
        maxprofit=rmax-lmin
        lmaxprofit=self.divide(prices,s,mid)
        rmaxprofit=self.divide(prices,mid+1,t)
        if lmaxprofit > maxprofit:
            maxprofit = lmaxprofit
        if rmaxprofit > maxprofit:
            maxprofit = rmaxprofit
        return maxprofit

2.动态规划:d[i] 表示前i + 1个价格中最大利润, min[i] 表示前i + 1个中最小的买入价格,d[i + 1] = max{d[i], prices[i + 1] - min[i]},求出d[i + 1]后,更新min[i + 1],时间复杂度为O(n)

class Solution:
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        length = len(prices)
        if length == 0:return 0
        d = [0] * length
        min = [0] * length
        d[0] = 0
        min[0] = prices[0]
        
        for i in range(1, length):
            d[i] = prices[i] - min[i - 1]
            min[i] = prices[i]
            if d[i] < d[i - 1]:
                d[i] = d[i - 1]
            if min[i - 1] < min[i]:
                min[i] = min[i - 1]
        
        return d[length - 1]
int maxProfit(vector<int> &prices) {
    int maxPro = 0;
    int minPrice = INT_MAX;
    for(int i = 0; i < prices.size(); i++){
        minPrice = min(minPrice, prices[i]);
        maxPro = max(maxPro, prices[i] - minPrice);
    }
    return maxPro;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值