力扣刷题笔记:188. 买卖股票的最佳时机 IV(动态规划+贪心算法,优秀算法搬运,详细解析)

题目:

188.买卖股票的最佳时机 IV
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入:k = 2, prices = [2,4,1] 输出:2 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天
(股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

示例 2:

输入:k = 2, prices = [3,2,6,5,0,3] 输出:7 解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3
天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。

提示:

0 <= k <= 109
0 <= prices.length <= 1000
0 <= prices[i] <= 1000

题解:

解题思路:
首先要确定k的取值范围否则会产生超时的问题,因为买卖占用两天,所以分情况执行。。。

if:k>=n//2,会变成122题,解法此处略过(见代码注释);

else:因为只能持有一只股票,因此流程肯定是[买,卖…,买,卖]把成本和利润创造两个一维数组,长短为k+1,就是寻找最小成本然后计算最大利润。

注:当k=1时,即为寻找算小价格然后计算最大利润。
题解代码:

class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        n = len(prices)
        if n <= 1: return 0  #如果只有一天的股票价格,则不存在交易
        if k >= n//2:    #如果交易次数k大于总天数整除2,即相当于交易次数无限制
            profit = 0
            #交易次数无限制,则只要统计后一天大于前一天的总和,即为最大利润
            for i in range(1, len(prices)):
                if prices[i] > prices[i-1]:
                    profit += prices[i] - prices[i-1]
            return profit 
        else:
            # k < n//2 时,交易次数有限制
            # 定义初始成本为无穷大
            cost = [float('inf') for i in range(k+1)]
            # 定义初始利润为0
            profit = [0 for i in range(k+1)]
            # 进行成本动态规划,贪心算法
            for p in prices:
                for i in range(1, k+1):
                    #print(cost[i], p-profit[i-1])
                    cost[i] = min(cost[i], p-profit[i-1])
                    #print(profit[i], p-cost[i])
                    profit[i] = max(profit[i], p-cost[i])
                    #print(p, i, profit, cost)
            return profit[-1]

算法确实高级!
在这里插入图片描述

作者:riven-iz
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/solution/yi-wei-shu-zu-xiao-bai-jie-fa-yong-shi-chao-yue-97/
来源:力扣(LeetCode)https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值