leetcode刷题-121买卖股票的最佳时机

179 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。