Version: Next

121.买股票的最佳时机

股票题
  • 122.买卖股票的最佳时机2
  • 123.买卖股票的最佳时机3
  • 188.买卖股票的最佳时机4
  • 714.买卖股票的最佳时机含手续费

121. 买卖股票的最佳时机

难度 简单

给定一个数组 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)

直观数组法

对于数组

012345
354162
  • 不要从买的时候思考,从卖的时机思考
  • 记录 从xx天卖出,可以获得的最大利润,倒推出哪一天买入好
    • 记录之前天中的 最低价
    • 记录能获得的 最大利润
    • 每天的 新值 与 最低值 比较
      • 新值 比 最低值 还小:更新 最低值 为 新值
      • 新值 比 最低值 大:新值 - 最低值 = 当天能获得利润
        • 当天利润 与 最大利润比较,决定是否更新最大利润值
      • 新值 等于 最低值:什么也不做
卖出价354162
买入价3311
利润2151
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;
}

动态规划

012345
715364

假设 第 i 天 买,第 j 天 卖的利润是

  • i ~ j 天内,所有相邻两天股价差的和
  • 第 1 天买 第 4 天 卖的利润是:(6 - 3) + ( 3 - 5) + (5 - 1) == 6 - 1 == 5

相邻两天的股价差:

0 ~ 11 ~ 22 ~ 33 ~ 44 ~ 5
-64-23-2

至此,问题转化为求 最大子数组和 问题,或说 最大连续子序列和