持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
一、题目
LeetCode 买卖股票的最佳时机
给定一个数组 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 <= 105
0 <= prices[i] <= 104
二、题解
题目给定的数组表示为某天股票的价格,只能在某一天买入,然后在之后的一天卖出,以此来计算利润。如果需要获得收益那就必须得在低价的时候买入,然后高价的时候卖出,因此我们可以想到查询给定数组中的两个值,满足两个值的差为最大,并且较大值在较小值后面,对此就需要双重循环对每一天的价格查询期最大的差值,因为数组长度比较大,应该会超时。
方法一
给定的数组价格是固定的,我们只能选择在某一天买入股票,然后再需要在之后的某一天卖出,只能是买入卖出操作一次,这样如果要获取最大的利用很显然的就需要在股票的最低价格时买入,再在其后的最高价格卖出。对此我们可以假设最低价格是minPrice,然后考虑在每一天的时候卖出能获取的最大利用是多少,那么关键就是这个最低的价格了。
具体的我们一开始就假设最低价格minPrice是第一天的价格,然后在第一天之后的价格中卖出能获取的收益是多少,最后只需要记录最大的收益即可。但是呢第一天的价格也不一定就是最低的价格啊,所以我们在计算之后能卖出的收益前需要判断一下,如果这一天的价格是比之前价格低那就更新最低的价格minPrice。更新了这个最低的价格minPrice也不会影响之前计算的收益,因为这个最低价格只有在后面卖出才有效。这样一边遍历一边查询最小值在计算收益,最后遍历结束时返回最大收益就可以了。
三、代码
方法一 Java代码
class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0;
int minPrice = prices[0];
for (int i = 1; i < prices.length; i++) {
if (prices[i] < minPrice) {
minPrice = prices[i];
}
maxProfit = Math.max(prices[i] - minPrice, maxProfit);
}
return maxProfit;
}
}
时间复杂度:O(n),需要遍历一次数组元素。
空间复杂度:O(1),只需要常数的空间。