一、题目描述
给你一个整数数组 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 。
二、解题思路
针对“买卖股票的最佳时机”问题,我们可以采用贪心算法来求解。贪心算法的原理是在每一步都做出当前情况下最优的选择,累积这些局部最优解以获得全局最优解。
具体操作如下:
- 初始化一个变量maxProfit,用于记录最大利润,初始值为0。
- 遍历股票价格数组,从第二天开始,比较每一天的股票价格与前一天的价格。
- 如果发现价格上升,即今天的价格大于昨天的价格,我们就假设在前一天买入,在当天卖出,将这两天的价格差累加到maxProfit中。
- 如果价格没有上升,我们就不进行任何操作,因为此时买入卖出不会产生利润。
- 遍历完成后,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)。
这意味着算法的运行时间随着输入数组长度的增加而线性增加,而所需的空间不会随着输入规模的增加而增加。
五、总结知识点
-
数组的遍历:使用for循环遍历数组
prices
,这是处理数组数据的基本操作。 -
索引操作:通过数组的索引
i
和i-1
来访问相邻元素,这是数组操作中常用的技巧。 -
条件语句:使用
if
语句来检查当前元素是否大于前一个元素,这是控制程序流程的基本手段。 -
累加操作:使用
+=
运算符来累加每次交易的利润到maxProfit
变量中,这是常见的累加操作。 -
整数运算:代码中涉及到的都是整数类型的运算,这是编程中最基本的数据类型之一。
-
函数定义:
maxProfit
函数的定义,包括输入参数int[] prices
和返回类型int
,这是面向对象编程中方法定义的基本格式。 -
返回值:函数通过
return
语句返回最大利润值,这是函数返回结果的标准方式。 -
算法思想:贪心算法的应用,即每次选择当前情况下最优的选择(价格上涨时进行买卖),从而累积全局最优解。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。