文章目录
一、题目概述
题目描述
给定一个数组 prices,其中 prices[i] 表示第 i 天股票的价格。
你只能选择 某一天买入股票,并在未来的某一天卖出股票,设计一个算法来计算你所能获取的最大利润。
如果你不能获取任何利润,返回 0。
示例
输入:prices = [7,1,5,3,6,4]
输出:5
解释:在第 2 天(价格=1)买入,在第 5 天(价格=6)卖出,最大利润 = 6 - 1 = 5
二、问题本质分析
这道题的核心在于:
在卖出那一天之前,找到一个价格最低的买入点,使得差值最大
换句话说,就是在遍历价格的过程中:
- 不断记录「历史最低价格」
- 尝试用当前价格卖出,计算利润
- 取所有利润中的最大值
三、解法一:暴力枚举(理解用,不推荐)
1. 解题思路
枚举所有可能的买入和卖出组合:
- 外层循环:买入日
i - 内层循环:卖出日
j (j > i) - 计算
prices[j] - prices[i] - 取最大值
2. 思维示意图(mermaid)
3. Java 代码
public class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0;
int n = prices.length;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
maxProfit = Math.max(maxProfit, prices[j] - prices[i]);
}
}
return maxProfit;
}
}
4. 复杂度分析
| 项目 | 复杂度 |
|---|---|
| 时间复杂度 | O(n²) |
| 空间复杂度 | O(1) |
四、解法二:动态规划(状态转移视角)
1. 状态定义
我们定义两个状态:
dp[i][0]:第i天 不持有股票 的最大利润dp[i][1]:第i天 持有股票 的最大利润
2. 状态转移方程
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], -prices[i])
解释:
- 只允许一次买入,因此持有股票的最大收益只能来自「第一次买入」
3. 状态转移图(mermaid)
4. Java 代码(空间优化版)
public class Solution {
public int maxProfit(int[] prices) {
int dp0 = 0; // 不持股
int dp1 = -prices[0]; // 持股
for (int i = 1; i < prices.length; i++) {
dp0 = Math.max(dp0, dp1 + prices[i]);
dp1 = Math.max(dp1, -prices[i]);
}
return dp0;
}
}
5. 复杂度分析
| 项目 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
五、解法三:贪心算法(最推荐)
1. 核心思想
- 用一个变量
minPrice记录遍历过程中出现的最低价格 - 对于当前价格
price:- 尝试卖出,计算
price - minPrice - 更新最大利润
- 更新最低买入价
- 尝试卖出,计算
2. 贪心过程示意(mermaid 时序图)
3. Java 代码(最优解)
public class Solution {
public int maxProfit(int[] prices) {
int minPrice = Integer.MAX_VALUE;
int maxProfit = 0;
for (int price : prices) {
if (price < minPrice) {
minPrice = price;
} else {
maxProfit = Math.max(maxProfit, price - minPrice);
}
}
return maxProfit;
}
}
4. 复杂度分析
| 项目 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
六、三种解法对比总结
| 解法 | 思想 | 时间复杂度 | 空间复杂度 | 推荐程度 |
|---|---|---|---|---|
| 暴力枚举 | 全部尝试 | O(n²) | O(1) | ★ |
| 动态规划 | 状态转移 | O(n) | O(1) | ★★★ |
| 贪心算法 | 维护最低价 | O(n) | O(1) | ★★★★★ |
- 本题是股票系列题目的基础题
- 贪心解法最简洁、效率最高
- 动态规划有助于理解后续更复杂的股票问题(多次交易、冷冻期、手续费等)
- 建议掌握 贪心 + DP 两种思路
——121. 买卖股票的最佳时机&spm=1001.2101.3001.5002&articleId=157980507&d=1&t=3&u=e6fc2b24c3a74d49a37110e2cc305061)
768

被折叠的 条评论
为什么被折叠?



