Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
力扣第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。
一、思路
这一题的目的是计算买卖股票获得的最大利润,但是我们要注意以下的一些规则:
- 买股票日期必须在卖股票日期之前
- 如果没有合适的买卖日期,则利润为
0。(例如示例中prices = [7,6,4,3,1],怎么买卖都是亏的,故不能出手) - 只能在某一天买一次股票,也只能在之后的某一天卖一次股票
上面的规则中最值得注意的就是,从买入到卖出整个过程只能发生一次。我们可以把股票每日的价格看做 折线图(x 轴为日期),此处以示例1中的 [7,1,5,3,6,4] 作为例子。
对于某一天能产生的最大利润来说,是用当前的值减去前面价格中的最小值。假设卖出日期为第 4 天,则第四天卖出的最大的利润为 3 - 1= 2。
综上所述:第 i 天卖出的最大利润为当前的价格减去历史最低价格(当前日之前)
经过上面的分析,实现的步骤大致分为以下两步:
- 初始化一维数组
minArr用于存储历史最低价格 - 遍历求出从
1 ~ i天卖出的最大利润,在其中取最大值即可
二、实现
实现代码
实现代码与思路中保持一致
public int maxProfit(int[] prices) {
int len = prices.length;
int[] minArr = new int[len];
minArr[0] = prices[0]; // 第一个元素前没有元素
for (int i=1; i<len; i++){
minArr[i] = Math.min(minArr[i-1], prices[i]);
}
int ret = 0; // 收益
for (int i=0; i<prices.length; i++){
ret = Math.max(ret, prices[i] - minArr[i]);
}
return ret;
}
测试代码
public static void main(String[] args) {
int[] prices = {7,1,5,3,6,4};
new Number121().maxProfit(prices);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~