leetcode 121 买卖股票的最佳时机

这篇博客讨论了如何使用动态规划算法解决寻找股票交易中最大利润的问题。作者提供了两种方法,一种是暴力法,时间复杂度为O(n^2),另一种是动态规划法,时间复杂度为O(n)。通过遍历股票价格数组并维护最低价格,动态规划法能更高效地找到最大利润。示例展示了如何应用这两种方法,并给出了不同情况下的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给定一个数组 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:直接遍历找出max(prices[j]−prices[i])
时间复杂度:O(n^2)。循环运行 n(n−1)/2次。
空间复杂度:O(1)。只使用了常数个变量。

class Solution {
    //暴力法
    public int maxProfit(int[] prices) {
        int len = prices.length;
        //有可能不发生教育,初始化为0
        int res = 0;
        //不交易的情况1
        if(len < 2){
            return res;
        }
        
        //枚举所有的交易
        for(int i = 0; i < len - 1; ++i){
            for(int j = i + 1; j < len; ++j){
                res = Math.max(res, prices[j] - prices[i]);
            }
        }
        return res;
    }
}

动态规划(一次遍历)

思路2:首先用一个变量minprice 记录过程中的一个最低价格(这个最低价格会在过程中发生改变)。再用之后的价格减最低价格得到利率,用maxprofit 记录最大的利润。

class Solution {
    //动态规划
    public int maxProfit(int[] prices) {
        //最低价格
        int minprice = Integer.MAX_VALUE;
        //最高利润
        int maxprofit = 0;
        int len = prices.length;
        for(int i =0; i < len; ++i){
            if(prices[i] < minprice){
                minprice = prices[i]; //找到一个价格最低点,低谷点
            }
            else if(prices[i] - minprice > maxprofit){
                maxprofit = prices[i] - minprice; //计算最大利润
            }
        }
        return maxprofit;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值