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

举报
府学路18号车神 发表于 2022/04/11 15:20:28 2022/04/11
【摘要】 从今天开始和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~以下为我的天梯积分规则:每日至少一题:一题积分+10分 若多做了一题,则当日积分+20分(+10+10)若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)初始分为100分若差一天没做题,则扣积分-10分(周六、周日除外注:休息)坚持!!...

从今天开始和车神哥一起来提升自己的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


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

加油!!!

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

⚡⚡


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

ღ( ´・ᴗ・` )


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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。