<LeetCode天梯>Day002 买卖股票的最佳时机 II | 初级算法 | Python

本文通过一个Python编程实例,探讨如何使用动态规划算法解决寻找股票交易中最大利润的问题。作者首先介绍了题目背景和示例,然后分析了不同策略,包括遍历找最大差值和贪心算法。最终,作者提供了简洁的动态规划解决方案,并对代码进行了优化。文章还记录了作者的学习和进步过程,鼓励持续学习和刷题。
摘要由CSDN通过智能技术生成

从今天开始和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~

以下为我的天梯积分规则

每日至少一题:一题积分+10分
若多做了一题,则当日积分+20分(+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60


初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息
坚持!!!

初级算法

刷题目录

数组

在这里插入图片描述

题干

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

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

示例1:

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

示例2:

输入: prices = [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例3:

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

分析:

从题干来看,我们不知道Prices数组里面的价格是什么,也不知道哪一天需要购买哪一天需要卖出,但是我们知道索引号 i 代表天数,如果当第一天的价格很大时,那么不适合买入。等等,看示例的意思是我们可以通过遍历来知道哪一天的价格是最高和最低,貌似题干和现实是两码事,好!那么咱说干就干。
首先,先按索引号从小到大进行寻找,找到最大的价格那天和最小的那天,再进行判断,如果高价在前就不买入,低价在前就买入,先进行此策略购买。
策略二,如果价格区间很大,则在低价时买入,遇到高价则卖出,再遇到再买,然后再卖出。
策略三,遍历每一个数,前后计算出差值,如果后面的比前面小,则继续计算差值,然后再将其利润相加。

先试下代码:

# 2021.10.20 晚 没调出来

更新日志:2021.10.20 由于近日项目较多,测试了下写的 算法,还是有问题,明日再搞搞看了,害~

上面代码先空着,感觉思路不是很对,于是想到了动态规划来解决此问题。

当天交易完之后手里没有股票可能有两种情况,一种是当天没有进行任何交易,又因为当天手里没有股票,所以当天没有股票的利润只能取前一天手里没有股票的利润。一种是把当天手里的股票给卖了,既然能卖,说明手里是有股票的,所以这个时候当天没有股票的利润要取前一天手里有股票的利润加上当天股票能卖的价格。

当然这个算法还是有一点复杂,然后又想到了另外一个贪心算法,借用下图

在这里插入图片描述
所以就可以写成下面这样:

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面是不感觉还有点多,其实也就一行,再来一遍:

return sum([prices[i+1]-prices[i] for i in range(len(prices)-1) if prices[i+1]-prices[i] > 0])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

更新日志:2021.10.21 晚 贪心算法优化

Reference

  • 作者:力扣 (LeetCode)
    链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2zsx1/
    来源:力扣(LeetCode)

今日得分:+10
总得分:110
更新一下分数(2021.10.21):
总得分:120

加油!!!

❤坚持读Paper,坚持做笔记,坚持学习❤!!!
再加个坚持刷题!!!打天梯!!!
To Be No.1

⚡⚡


创作不易⚡,过路能❤关注收藏点个赞三连就最好不过了

ღ( ´・ᴗ・` )


命运负责洗牌和发牌,而我们只能出牌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

府学路18号车神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值