Python每日一练-----买卖股票的最佳时机

(day16)

目录

🖍题目:

题目分析:

解题思路:

一、暴力解法

代码实现

🌈代码注释

二、动态规划解法

代码实现

🌈代码注释


🖍题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

1 <= prices.length <= 105)

🌠示例 1:

输入:[7,1,5,3,6,4]
输出:5
说明:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。


     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

🌠示例 2:

输入:prices = [7,6,4,3,1]

输出:0

说明:在这种情况下, 没有交易完成, 所以最大利润为 0。

题目分析:

题目要求以就少的价钱买进股票然后以最高的价钱抛售股票来获取最高的利益(当然题目中的情况是不现实的,现实中很难预测古票的涨落)且抛售股票要再买进股票前。

解题思路:

一、暴力解法

根据题目要求先买入股票后再卖出,可以将数组prices中的数两两相减,求其差值后用一个数组储存。两两相减的限制为数组prices中的后一个数 - 数前一个数。最后求储存差值数组的最大值。

代码实现

def maxProfit(prices):
        dp = []

        for i in range(len(prices)):
            for j in range(i, len(prices)):
                dp.append(prices[j] - prices[i])

        return max(dp) if max(dp) > 0 else 0

🌈代码注释

def maxProfit(prices):
        dp = []   # 用于储存差值的数组

        for i in range(len(prices)):
            for j in range(i, len(prices)):   # 保证prices[j]为后一个数
                dp.append(prices[j] - prices[i])

        return max(dp) if max(dp) > 0 else 0  # 如果获得的利益大于0返回最大值,如果<0返回0

暴力解题时间复杂度为O(n2),空间复杂度为O(n).

二、动态规划解法

获取最大利益的本质是什么?

1.找到最低的购买价格

2.在买入的前提下找到最高的抛售价格

前提:抛售必须在购入之前

代码实现

ef maxProfit(prices):
    min_input = prices[0]
    max_profit = 0
    for p in prices[1:]:
        min_input = min(p, min_input)
        max_profit = max(max_profit, p - min_input)

    return max_profit if len(prices) > 1 else 0

        

🌈代码注释

ef maxProfit(prices):
    min_input = prices[0]  # 第一天买入所需价钱
    max_profit = 0        # 初始化利润

    for p in prices[1:]:   # 从第二天开始遍历数组
        min_input = min(p, min_input)    # 比较后一天与前一天买入的价格,并用min()取最小值
                                        #以找到最底买入的价格
        max_profit = max(max_profit, p - min_input)  # 假设抛售比较前一天与后一天获得的利润
                                                    # 并用max()取最小值
    return max_profit if len(prices) > 1 else 0

时间复杂度O(n),空间复杂度O(1).

今天就到这,明天见。🚀

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亖夕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值