LeetCode题练习与总结:买卖股票的最佳时机--121-输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。 提示:

时间:2024-06-09 15:30:27
  • 1 <= prices.length <= 10^5
  • 0 <= prices[i] <= 10^4

二、解题思路

为了找到最大利润,我们需要找到买入和卖出股票的最佳时机。这个问题可以通过一次遍历数组来解决。我们可以在遍历过程中记录到目前为止遇到的最小价格,并且对于每一天,计算如果在这一天卖出股票能获得的最大利润。这样,我们就不需要考虑买入和卖出的具体时间点,只需要在遍历过程中不断更新最大利润即可。

具体步骤如下:

1. 初始化两个变量,minPrice设为第一天股票的价格,maxProfit设为0。

2. 遍历数组prices,对于每一天:

  • 计算如果在这一天卖出股票能获得的利润,即prices[i] - minPrice
  • 如果这个利润大于maxProfit,则更新maxProfit
  • 如果当前的股票价格prices[i]小于minPrice,则更新minPriceprices[i]

3. 遍历完成后,maxProfit就是能够获得的最大利润。

三、具体代码

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 if (price - minPrice > maxProfit) {
                maxProfit = price - minPrice;
            }
        }
        
        return maxProfit;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 代码中有一个循环,该循环遍历一次给定数组prices
  • 在循环内部,每次迭代只进行常数时间的操作,包括比较和赋值。
  • 因此,循环的时间复杂度是O(n),其中n是数组prices的长度。
2. 空间复杂度
  • 代码中使用了一个固定大小的变量minPrice来存储最小价格,以及一个固定大小的变量maxProfit来存储最大利润。
  • 这些变量使用的空间不随输入数组的大小而变化。
  • 因此,空间复杂度是O(1),即常数空间复杂度。

综上所述,代码的时间复杂度是O(n),空间复杂度是O(1)。

五、总结知识点