一、题目描述、
给定一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。在这个问题中,你可以在任意一天决定购买和/或出售股票,但在任何时候最多只能持有一股股票。你也可以在同一天购买后立即出售。目标是返回你能获得的最大利润。
输入输出示例
-
示例1
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(价格 = 1)买入,在第 3 天(价格 = 5)卖出,利润 = 4。然后在第 4 天(价格 = 3)买入,在第 5 天(价格 = 6)卖出,利润 = 3。最大总利润 = 4 + 3 = 7。
-
示例2
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(价格 = 1)买入,在第 5 天(价格 = 5)卖出,利润=4。最大总利润=4。
-
示例3
输入:prices = [7,6,4,3,1]
输出:0
解释:无法获得正利润,因此不参与交易,最大利润为 0。
约束条件
-
你可以在任意一天买入和/或卖出股票。
-
在任何时刻最多只能持有一股股票。
-
可以在同一天买入并卖出。
二、解题思路以及代码实现
方法 1:贪心算法(相邻差值法)
解题思路
每当遇到价格上涨的情况,就进行交易。具体来说,如果第二天的价格高于今天的价格,就可以把今天的股票卖出,获取利润。
具体步骤
-
初始化
max_profit
为 0,表示初始没有利润。 -
从第二天开始遍历价格数组(从索引 1 到 n-1)。
-
对于每一天,检查今天的价格与昨天的价格:
-
如果今天的价格
prices[i]
大于昨天的价格prices[i - 1]
,则计算利润并累加到max_profit
中:-
利润计算公式为
prices[i] - prices[i - 1]
。
-
-
-
返回
max_profit
,即为最大利润。
代码实现
def maxProfit(prices):
max_profit = 0 # 初始化最大利润为0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]: # 如果今天的价格高于昨天的价格
max_profit += prices[i] - prices[i - 1] # 累加利润
return max_profit
复杂度分析
-
时间复杂度:O(n),n 为价格数组的长度。
-
空间复杂度:O(1),只使用常量空间。
方法 2:动态规划(仅计算累积利润)
解题思路
动态规划方法本质上与贪心算法相似,但它强调通过状态转移来解决问题。在本题中,每次价格上涨的情况仍然是关键。
具体步骤
-
初始化
max_profit
为 0,表示初始没有利润。 -
遍历价格数组,从第一天到倒数第二天(从索引 0 到 n-2):
-
对于每一天,计算当前价格与下一天价格的差值。
-
使用
max(0, prices[i + 1] - prices[i])
来计算利润:-
如果差值为正(即价格上涨),则累加到
max_profit
。 -
如果差值为负(即价格下跌),则不进行交易,保持利润为 0。
-
-
-
返回
max_profit
,即为最大利润。
代码实现
def maxProfit(prices):
max_profit = 0 # 初始化最大利润为0
for i in range(len(prices) - 1):
# 计算今天和明天的价格差值
max_profit += max(0, prices[i + 1] - prices[i]) # 仅累加正利润
return max_profit
复杂度分析
-
时间复杂度:O(n),n 为价格数组的长度。
-
空间复杂度:O(1),只使用常量空间。