首页 > 试题广场 >

买卖股票的最好时机(三)

[编程题]买卖股票的最好时机(三)
  • 热度指数:37571 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1. 你最多可以对该股票有两笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
2. 如果不能获取收益,请返回0
3. 假设买入卖出均无手续费

数据范围:,股票的价格满足
要求: 空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
示例1

输入

[8,9,3,5,1,3]

输出

4

说明

第三天(股票价格=3)买进,第四天(股票价格=5)卖出,收益为2
第五天(股票价格=1)买进,第六天(股票价格=3)卖出,收益为2
总收益为4。              
示例2

输入

[9,8,4,1]

输出

0
示例3

输入

[1,2,8,3,8]

输出

12

说明

第一笔股票交易在第一天买进,第三天卖出;第二笔股票交易在第四天买进,第五天卖出;总收益为12。
因最多只可以同时持有一只股票,所以不能在第一天进行第一笔股票交易的买进操作,又在第二天进行第二笔股票交易的买进操作(此时第一笔股票交易还没卖出),最后两笔股票交易同时在第三天卖出,也即以上操作不满足题目要求。        

备注:
总天数不大于200000。保证股票每一天的价格在[1,100]范围内。
class Solution:
    def maxProfit(self , prices: List[int]) -> int:
        # write code here
        b1=b2=float("inf")
        s1=s2=float("-inf")
        for p in prices:
            b1=min(b1,p)
            s1=max(s1,p-b1)
            b2=min(b2,p-s1)
            s2=max(s2,p-b2)
        return s2
        

发表于 2022-10-08 06:38:24 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 两次交易所能获得的最大收益
# @param prices int整型一维数组 股票每一天的价格
# @return int整型
#
class Solution:
    def maxProfit(self , prices: List[int]) -> int:
        if len(prices) == 0:
            return 0
        b1, s1, b2, s2 = -prices[0], 0, -prices[0], 0
        for p in prices:
            b1 = max(b1, -p)
            s1 = max(s1, b1+p)
            b2 = max(b2, s1-p)
            s2 = max(s2, b2+p)
        return max(s2, 0)

发表于 2022-10-05 22:36:18 回复(0)
class Solution:
    def maxProfit(self , prices: List[int]) -> int:
        ma = ma2 = 0
        low = prices[0]
        # 记录第一次交易的最低价的下标,和卖出价的下标
        low_idx = sell_idx = 0
        # 第一次交易
        for i in range(len(prices)):
            if prices[i]-low > ma:
                sell_idx = i
            ma = max(ma, prices[i]-low)
            if prices[i] < low:
                low = prices[i]
                low_idx = i
        del prices[low_idx:sell_idx+1]
        print(low_idx, sell_idx, ma)
        # 第二次交易,找第二小的数
        low2 = prices[0]
        for i in range(len(prices)):
            ma2 = max(ma2, prices[i]-low2)
            if prices[i] < low2:
                low2 = prices[i]
        
        return ma+ma2
发表于 2022-09-27 17:36:49 回复(0)