赞
踩
给定一个数组 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
,则更新minPrice
为prices[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;
- }
- }
prices
。prices
的长度。minPrice
来存储最小价格,以及一个固定大小的变量maxProfit
来存储最大利润。综上所述,代码的时间复杂度是O(n),空间复杂度是O(1)。
数组的遍历:使用增强型for
循环来遍历数组prices
中的每个元素。
变量的初始化:minPrice
被初始化为Integer.MAX_VALUE
,以便在遍历过程中找到最小的价格;maxProfit
被初始化为0,用于存储最大利润。
条件语句:使用if-else
语句来检查当前价格是否小于最小价格,或者卖出股票的利润是否大于当前的最大利润。
最大值和最小值的更新:在遍历过程中,如果找到更小的价格,则更新minPrice
;如果找到更大的利润,则更新maxProfit
。
算术运算:计算当前价格和最小价格之间的差值,以确定卖出股票的利润。
整数类型的比较:在代码中进行了多次整数类型的比较,以决定是否更新minPrice
和maxProfit
。
整数类型的最大值:使用Integer.MAX_VALUE
作为minPrice
的初始值,以确保任何价格都不会大于它。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。