[HOT 100] 0121. 买卖股票的最佳时机

文章目录

      • 1. 题目链接
      • 2. 题目描述
      • 3. 题目示例
      • 4. 解题思路
      • 5. 题解代码
      • 6. 复杂度分析

1. 题目链接


121. 买卖股票的最佳时机 - 力扣(LeetCode)

2. 题目描述


给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

3. 题目示例


示例 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。

4. 解题思路


  1. 问题理解:这是最简单的股票买卖问题,只允许进行一次买入和卖出操作。
  2. 核心思想
    • 在历史最低点买入
    • 在当前价格卖出
    • 记录整个过程中的最大利润
  3. 关键变量
    • minPrice:记录遍历过程中遇到的最低价格(最佳买入点)
    • ans:记录当前价格与历史最低价的差值(即潜在利润)
  4. 算法流程
    • 初始化历史最低价为第一天的价格
    • 遍历每一天的价格:
      • 计算当前卖出能获得的利润(当前价格 - 历史最低价)
      • 更新最大利润
      • 更新历史最低价
  5. 边界情况
    • 如果价格一直下跌,最大利润为0(不进行交易)
    • 如果只有一天的价格,无法完成交易,利润为0

5. 题解代码


class Solution {
    public int maxProfit(int[] prices) {
        int ans = 0;            // 记录最大利润,初始为0
        int minPrice = prices[0]; // 记录历史最低价格,初始为第一天的价格
        
        // 遍历每一天的价格
        for(int p : prices){
            // 计算当前价格与历史最低价的差值,更新最大利润
            ans = Math.max(ans, p - minPrice);
            // 更新历史最低价格
            minPrice = Math.min(minPrice, p);
        }
        return ans; // 返回最大利润
    }
}


6. 复杂度分析


时间复杂度:O(n),其中n是价格数组的长度。我们只需要遍历价格数组一次。

空间复杂度:O(1),只使用了常数个额外变量(ans和minPrice)。

你可能感兴趣的:(算法,HOT,100)