⛅(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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄