LeetCode题练习与总结:买卖股票的最佳时机Ⅱ--122

239 篇文章 0 订阅
142 篇文章 0 订阅

一、题目描述

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     总利润为 4 。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

二、解题思路

针对“买卖股票的最佳时机”问题,我们可以采用贪心算法来求解。贪心算法的原理是在每一步都做出当前情况下最优的选择,累积这些局部最优解以获得全局最优解。

具体操作如下:

  1. 初始化一个变量maxProfit,用于记录最大利润,初始值为0。
  2. 遍历股票价格数组,从第二天开始,比较每一天的股票价格与前一天的价格。
  3. 如果发现价格上升,即今天的价格大于昨天的价格,我们就假设在前一天买入,在当天卖出,将这两天的价格差累加到maxProfit中。
  4. 如果价格没有上升,我们就不进行任何操作,因为此时买入卖出不会产生利润。
  5. 遍历完成后,maxProfit就是能获得的最大利润。

通过贪心算法,我们可以在每次股票价格上涨时都“获得”利润,而不需要关心具体的买入和卖出日期。这种方法能够确保我们抓住所有正向的价格变动,从而获得可能的最大利润。

三、具体代码

public class Solution {
    public int maxProfit(int[] prices) {
        int maxProfit = 0;
        for (int i = 1; i < prices.length; i++) {
            // 如果今天的股票价格比昨天高,就假设在昨天买入,在今天卖出
            if (prices[i] > prices[i - 1]) {
                maxProfit += prices[i] - prices[i - 1];
            }
        }
        return maxProfit;
    }
}

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

1. 时间复杂度
  • 该算法使用了一个for循环来遍历价格数组prices
  • for循环的次数与数组prices的长度相同,设数组长度为n
  • 在循环内部,只有一个简单的比较操作和一个加法操作,这些操作的时间复杂度都是常数时间,即O(1)。
  • 因此,总的时间复杂度是O(n),其中n是数组prices的长度。
2. 空间复杂度
  • 该算法只使用了几个基本类型的变量,如maxProfit和循环变量i,它们占用的空间是常数大小的。
  • 数组prices是输入数据,不计入算法的空间复杂度计算。
  • 因此,该算法的空间复杂度是O(1),即常数空间复杂度。

综上所述,该算法的时间复杂度是O(n),空间复杂度是O(1)。

这意味着算法的运行时间随着输入数组长度的增加而线性增加,而所需的空间不会随着输入规模的增加而增加。

五、总结知识点

  1. 数组的遍历:使用for循环遍历数组prices,这是处理数组数据的基本操作。

  2. 索引操作:通过数组的索引ii-1来访问相邻元素,这是数组操作中常用的技巧。

  3. 条件语句:使用if语句来检查当前元素是否大于前一个元素,这是控制程序流程的基本手段。

  4. 累加操作:使用+=运算符来累加每次交易的利润到maxProfit变量中,这是常见的累加操作。

  5. 整数运算:代码中涉及到的都是整数类型的运算,这是编程中最基本的数据类型之一。

  6. 函数定义maxProfit函数的定义,包括输入参数int[] prices和返回类型int,这是面向对象编程中方法定义的基本格式。

  7. 返回值:函数通过return语句返回最大利润值,这是函数返回结果的标准方式。

  8. 算法思想:贪心算法的应用,即每次选择当前情况下最优的选择(价格上涨时进行买卖),从而累积全局最优解。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值