LeetCode 121.买卖股票的最佳时机

题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。

思路:

  • 本题最容易想到的就是暴力解法,两次循环遍历数组,求最大值。此方法时间复杂度为O(n²),我们需要将他进行改进
  • 我们可以在遍历的时候定义一个当前历史最小值minPrice,试想一下生活中我们肯定希望在股价最低点买入,这样利润才会最大。也就是求最大差值maxProfit
  • 如果prices[i] < minPrice,说明股价还能更低,那么就更新历史最小值。否则如果prices[i] - minPrice > maxProfit,说明当前最大利润(也就是最大差值)还能更大,将maxProfit进行更新,这样一次循环我们就可以确定最大利润值

以下为代码+注释:

public int maxProfit(int[] prices) {
        // 记录一个历史最低值,每次拿当前价格和历史最低值求差值
        int maxProfit = 0;
        int minPrice = Integer.MAX_VALUE;
        for(int i = 0; i < prices.length; i++){
            // 如果当前值比历史最低值还小,那么更新历史最低值
            if(prices[i] < minPrice){
                minPrice = prices[i];
                // 否则,说明当前价格比历史最低值高,那么就更新利润为当前最大
            }else if(prices[i] - minPrice > maxProfit){
                maxProfit = prices[i] - minPrice;
            }
        }
        return maxProfit;
    }

笔者也在不断学习中,如有错误,欢迎指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值