leetcode 121 买卖股票的最佳时机

这篇博客介绍了一个使用动态规划算法解决寻找股票交易中最大利润的问题。具体策略是维护两个变量,一个是最小价格,另一个是最大利润。通过遍历股票价格数组,不断更新这两个变量,最终得到最大利润。代码实现简洁且高效,适用于处理此类优化问题。

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

思路:动态规划
1.确定初始值
刚开始可能没有持股 -》收益就是0 max = 0;
当第一天买入的时候 -其价格可以认为是最低价min = prices[0]
2.找状态转移方程
要获取第i天的最大的收益 -》 第i天的价格与前i-1天中最小的价格之差
也就是max = Math.max(max, prices[i]-min)
min = Math.min(prices[i], min)
3.确定边界条件 -> n

4.结果

public int maxProfit(int[] prices) {
int n = prices.length;
if (n <= 1) {
return 0;
}
int max = 0;
int min = prices[0];
for (int i = 1; i < n; i++) {
min = Math.min(min, prices[i]);
max = Math.max(max, prices[i] - min);
}
return max;
}

### 动态规划代码及分析 #### 代码 ```python from typing import List class Solution: def maxProfit(self, prices: List[int]) -> int: length = len(prices) if length == 0: return 0 dp = [[0, 0] for _ in range(length)] dp[0][0] = -prices[0] for i in range(1, length): dp[i][0] = max(dp[i - 1][0], -prices[i]) dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]) return dp[-1][-1] ``` #### 分析总结 此代码运用动态规划思想解决问题。`dp[i][0]`表示第`i`天持有股票的最大利润,`dp[i][1]`表示第`i`天不持有股票的最大利润。初始化时,第 0 天持有股票的利润为`-prices[0]`,即买入第一天的股票。在后续遍历中,`dp[i][0]`可能是前一天就持有股票,或者当天买入股票,取两者最大值;`dp[i][1]`可能是前一天就不持有股票,或者前一天持有股票当天卖出,同样取两者最大值。最后返回最后一天不持有股票的最大利润,即为结果[^1]。 ### 贪心算法代码及分析 #### 代码 ```java class Solution { public int maxProfit(int[] prices) { // 边界条件检查:如果数组为空或只有一个元素,无法完成交易,返回0 if (prices == null || prices.length <= 1) { return 0; } // 初始化最低价格为第一天的价格 int minPrice = prices[0]; // 初始化最大利润为0(如果无法盈利就返回0) int maxProfit = 0; // 从第二天开始遍历价格数组 for (int i = 1; i < prices.length; i++) { // 情况1:如果当前价格比历史最低价格还低,更新最低价格 if (prices[i] < minPrice) { minPrice = prices[i]; } // 情况2:如果当前价格高于历史最低价格,计算利润并更新最大利润 else { int currentProfit = prices[i] - minPrice; if (currentProfit > maxProfit) { maxProfit = currentProfit; } } } return maxProfit; } } ``` #### 分析总结 贪心算法的核心在于维护一个最低价格`minPrice`和最大利润`maxProfit`。从第二天开始遍历价格数组,若当前价格低于`minPrice`,则更新`minPrice`;若高于`minPrice`,则计算当前利润,若当前利润大于`maxProfit`,则更新`maxProfit`。最终返回`maxProfit`,此算法的时间复杂度为$O(n)$,空间复杂度为$O(1)$,相对动态规划更为简单高效,但贪心算法只能解决一次买卖的情况,对于复杂的交易规则和限制条件,不如动态规划灵活[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值