Version: Next
121.买股票的最佳时机
股票题
- 122.买卖股票的最佳时机2
- 123.买卖股票的最佳时机3
- 188.买卖股票的最佳时机4
- 714.买卖股票的最佳时机含手续费
难度 简单
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 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。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
You are given an array prices
where prices[i]
is the price of a given stock on the ith
day.
You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock.
Return the maximum profit you can achieve from this transaction. If you cannot achieve any profit, return 0
.
Example 1:
Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Note that buying on day 2 and selling on day 1 is not allowed because you must buy before you sell.
Example 2:
Input: prices = [7,6,4,3,1]
Output: 0
Explanation: In this case, no transactions are done and the max profit = 0.
Constraints:
1 <= prices.length <= 105
0 <= prices[i] <= 104
复杂度要求
- 时间复杂度 O(n)
- 空间复杂度 O(1)
直观数组法
对于数组
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
3 | 5 | 4 | 1 | 6 | 2 |
- 不要从买的时候思考,从卖的时机思考
- 记录 从xx天卖出,可以获得的最大利润,倒推出哪一天买入好
- 记录之前天中的
最低价
- 记录能获得的
最大利润
- 每天的
新值
与 最低值 比较- 新值 比 最低值 还小:更新 最低值 为 新值
- 新值 比 最低值 大:新值 - 最低值 = 当天能获得利润
- 当天利润 与 最大利润比较,决定是否更新最大利润值
- 新值 等于 最低值:什么也不做
- 记录之前天中的
卖出价 | 3 | 5 | 4 | 1 | 6 | 2 |
---|---|---|---|---|---|---|
买入价 | 3 | 3 | 1 | 1 | ||
利润 | 2 | 1 | 5 | 1 |
public int maxProfit(int[] prices) {
if (prices.length == 1) return 0;
int minValue = prices[0];
int maxProfit = 0;
for (int i = 1; i < prices.length; i++) {
// 新值 比 最低值 还小:更新 最低值 为 新值
if (prices[i] < minValue) minValue = prices[i];
// 新值 比 最低值 大:新值 - 最低值 = 当天能获得利润
else if (prices[i] > minValue)
// 当天利润 与 最大利润比较,决定是否更新最大利润值
maxProfit = Math.max(maxProfit, prices[i] - minValue);
}
return maxProfit;
}
动态规划
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
7 | 1 | 5 | 3 | 6 | 4 |
假设 第
i
天 买,第j
天 卖的利润是
- 第
i
~j
天内,所有相邻两天股价差的和- 第 1 天买 第 4 天 卖的利润是:(6 - 3) + ( 3 - 5) + (5 - 1) == 6 - 1 == 5
相邻两天的股价差:
0 ~ 1 | 1 ~ 2 | 2 ~ 3 | 3 ~ 4 | 4 ~ 5 |
---|---|---|---|---|
-6 | 4 | -2 | 3 | -2 |
至此,问题转化为求 最大子数组和
问题,或说 最大连续子序列和