121. 买股票的最佳时机

题目:买股票的最佳时机

链接:link

解题思路

解法一:暴力枚举法
  • 通过两层循环来尝试所有可能的买入和卖出日期组合,并计算每种组合的利润,然后找出最大的利润。第 1 天买可在未来 n − 1 n-1 n1天卖出,第 2 天买可在未来 n − 2 n-2 n2天卖出……以此类推。
  • 循环了 ( n − 1 ) + ( n − 2 ) + . . . + 0 = n ( n − 1 ) 2 (n-1)+(n-2)+...+0=\frac{n(n-1)}{2} (n1)+(n2)+...+0=2n(n1),时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1)
代码
 public int maxProfit(int[] prices) {  
        if (prices == null || prices.length <= 1) {  
            return 0;  
        }  
          
        int maxProfit = 0;  
          
        // 外层循环遍历所有可能的买入日期  
        for (int i = 0; i < prices.length - 1; i++) {  
            // 内层循环遍历所有可能的卖出日期(在买入日期之后)  
            for (int j = i + 1; j < prices.length; j++) {  
                // 计算当前买入卖出组合的利润  
                int profit = prices[j] - prices[i];  
                // 如果利润大于当前最大利润,则更新最大利润  
                if (profit > maxProfit) {  
                    maxProfit = profit;  
                }  
            }  
        }  
          
        return maxProfit;  
    }  
解法二:一次遍历
  • 如果第 i i i天卖出股票,则最大利润为(该天的股价-前面天数中最小的股价),然后与已知的最大利润比较,如果大于则更新当前最大利润的值。
  • 遍历数组 p r i c e s prices prices,我们可以同时记录到目前为止所看到的最低价格 m i n P r i c e minPrice minPrice和最大利润 m a x P r o f i t maxProfit maxProfit。对于每一天的价格 p r i c e s [ i ] prices[i] prices[i],更新 m i n P r i c e minPrice minPrice(如果它更低的话),并计算如果在这一天卖出股票所能获得的利润。如果这个利润大于我们目前所知的 m a x P r o f i t maxProfit maxProfit,则更新 m a x P r o f i t maxProfit maxProfit
  • 时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)
代码
public int maxProfit(int[] prices) {  
        if (prices == null || prices.length == 0) {  
            return 0;  
        }  
          
        int minPrice = prices[0]; // 初始化最低价格为第一天的价格  
        int maxProfit = 0; // 初始化最大利润为0  
          
        for (int price : prices) {  
            // 更新最低价格  
            minPrice = Math.min(minPrice, price);  
            // 计算当前卖出所能获得的利润,并更新最大利润  
            maxProfit = Math.max(maxProfit, price - minPrice);  
        }  
          
        return maxProfit;  
    }  
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值