LeetCode题练习与总结:买卖股票的最佳时机--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 <= 10^5
  • 0 <= prices[i] <= 10^4

二、解题思路

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

具体步骤如下:

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

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

  • 计算如果在这一天卖出股票能获得的利润,即prices[i] - minPrice
  • 如果这个利润大于maxProfit,则更新maxProfit
  • 如果当前的股票价格prices[i]小于minPrice,则更新minPriceprices[i]
  1. 遍历完成后,maxProfit就是能够获得的最大利润。

三、具体代码

java 复制代码
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)。

五、总结知识点

  1. 数组的遍历 :使用增强型for循环来遍历数组prices中的每个元素。

  2. 变量的初始化minPrice被初始化为Integer.MAX_VALUE,以便在遍历过程中找到最小的价格;maxProfit被初始化为0,用于存储最大利润。

  3. 条件语句 :使用if-else语句来检查当前价格是否小于最小价格,或者卖出股票的利润是否大于当前的最大利润。

  4. 最大值和最小值的更新 :在遍历过程中,如果找到更小的价格,则更新minPrice;如果找到更大的利润,则更新maxProfit

  5. 算术运算:计算当前价格和最小价格之间的差值,以确定卖出股票的利润。

  6. 整数类型的比较 :在代码中进行了多次整数类型的比较,以决定是否更新minPricemaxProfit

  7. 整数类型的最大值 :使用Integer.MAX_VALUE作为minPrice的初始值,以确保任何价格都不会大于它。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关推荐
学习编程的Kitty7 分钟前
JavaEE初阶——多线程(5)单例模式和阻塞队列
java·开发语言·单例模式
m0_372257027 分钟前
项目下有多个模块,每个模块有pom文件,是怎么继承的
java·tomcat
oak隔壁找我27 分钟前
Spring AI 入门教程,使用Ollama本地模型集成,实现对话记忆功能。
java·人工智能·后端
懒羊羊不懒@28 分钟前
JavaSe—Stream流☆
java·开发语言·数据结构
郝开29 分钟前
最终 2.x 系列版本)2 - 框架搭建:pom配置;多环境配置文件配置;多环境数据源配置;测试 / 生产多环境数据源配置
java·spring boot·后端
Homeey1 小时前
深入理解ThreadLocal:从原理到架构实践的全面解析
java·后端
ANGLAL1 小时前
27.短链系统
java
Lisonseekpan1 小时前
Git 命令大全:从基础到高级操作
java·git·后端·github·团队开发
不当菜鸡的程序媛1 小时前
Flow Matching|什么是“预测速度场 vt=ε−x”?
人工智能·算法·机器学习
CodeCraft Studio1 小时前
国产化Excel处理控件Spire.XLS教程:使用Java将CSV转换为PDF(含格式设置)
java·pdf·excel·spire.xls·文档格式转换·csv转pdf