Leetcode-D7-1014. 观光组合 121. 买卖股票&122. 买卖股票

本文探讨了如何利用动态规划解决股票观光组合问题(1014题)和买卖股票的最佳时机(121、122题),通过迭代计算和优化策略,避免递归带来的效率问题。涉及数组操作、滚动数组和存储最大/最小值,展示了动态规划在优化决策过程中的应用。
摘要由CSDN通过智能技术生成

1014. 最佳观光组合

1、还是没有思路,想要递归
2、看了答案居然是把式子拆开看。
res = A[i] + A[j] + i - j (i < j)
(1)我们可以计算出A[j] - j
(2)我们也可以计算出 A[i]+i
(3)计算以j为结尾的每一组res,最后取最大值
3、不过这个和递归有啥关系呢?
4、超出时间限制

class Solution:
    def maxScoreSightseeingPair(self, values: List[int]) -> int:
        n = len(values)
        sum_value = [0]*n
        sub_value = [0]*n
        res = [0]*n
        for index,value in enumerate(values):
            # 得到values[i]+i
            sum_value[index] = index+value 
            # 得到values[j]-j
            sub_value[index] = value-index
        
        for j in range(1,n):
            res[j] = sub_value[j] + max(sum_value[:j])
        
        return max(res)

应该是for循环太多了

5、

class Solution:
    def maxScoreSightseeingPair(self, values: List[int]) -> int:
        n = len(values)
        res = [0]*n
        max_sum = 0
        for index,value in enumerate(values[1:]):
            # 记录到j的最大的values[i]+i
            max_sum = max(index+values[index],max_sum)
            # 得到values[j]-j
            res[index+1] = value-index-1 + max_sum 
        return max(res)

修改了一下,就可以了。在这里插入图片描述

本题的动态规划体现在values[i]+i的计算上,我们不需要把每一个计算结果都储存起来,我们只需要储存j之前的最大值即可。在遍历过程中,不断计算values[i]+i,将最大值储存起来。
注意:j的index从1开始。

121. 买卖股票的最佳时机

1、这题与上一题的思路类似。将数组遍历一遍,每次记录在j之前的最小值,然后计算prices[j]-min,储存在res数组中,最后返回max(res)
2、

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        pre_min = max(prices)
        res = [0]*n
        for index, value in enumerate(prices[1:]):
            pre_min = min(pre_min,prices[index])
            res[index+1] =value-pre_min 
        return max(res)

通过了~

122. 买卖股票的最佳时机 II

1、没有想法了
2、看了答案后:这和递归有啥关系???难道动态规划不止递归吗???
3、该题主要思路:连续上涨日最大利润=最后一天-第一天,中间的都消了。为了统一,也可以写成后一天-前一天。所以购买策略为:后一天比前一天高,则买;反之,则不买。
4、

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        profits = 0
        for i in range(1,n):
            profit = prices[i]-prices[i-1]
            if profit>0:
                profits = profits + profit
        return profits

啊这啊这这么简单的嘛???
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值