小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode121-买卖股票的最佳时机
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给定一个数组 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
本方案的思路主要是通过一次的遍历实现。将遍历的下一节点的值与当前循环内的最小值进行比较。如果小于当前的最小值,则可以认为进入新的买卖周期。同时将当前的最大收益进行记录,每次新的买卖周期与当前周期的最大收益进行比较。如果最大周期大于当前周期,则将最大收益进行替换。制止将整个数组循环遍历完毕,得到最大的收益,即为题目所需求的答案。 代码如下:
public int maxProfit(int[] prices) {
// 记录历史收益最大值
int maxprofit = 0;
// 记录买入节点值
int min = Integer.MAX_VALUE;
for (int i = 0; i < prices.length; i++) {
if(prices[i] < min){
min = prices[i];
}else{
maxprofit = prices[i] - min > maxprofit ? prices[i] - min : maxprofit;
}
}
return maxprofit;
}
复杂度分析
- 时间复杂度 o(m)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。