• Leetcode题目121.买卖股票的最佳时机(简单)


    题目描述:

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

    如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

    注意你不能在买入股票前卖出股票。

    示例 1:
    
    输入: [7,1,5,3,6,4]
    输出: 5
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
         注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
    示例 2:
    
    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

    代码实现:

    一、反向思维

    class Solution {
       public static int maxProfit(int[] prices) {
    
            int max = 0, sum, result = 0;
            for (int i = prices.length - 1; i >= 0; i--) {
                if (prices[i] > max) {
                    max = prices[i];
                }
                if ((sum = max - prices[i]) > result) {
                    result = sum;
                }
            }
            return result;
        }
    }

    复杂度分析

           时间复杂度:O(N)

           空间复杂度:O(1)

    二、暴力枚举

    使用两个变量 i 和 j ,它们分别表示买进这支股票和卖出这支股票,枚举它们在价格数组上可能出现的所有位置,写一个二重循环即可。

    class Solution {
         public static int maxProfit(int[] prices) {
    
            //暴力枚举
            int res = 0;
            for (int i = 0; i < prices.length - 1; i++) {
                for (int j = i + 1; j < prices.length; j++) {
                    res = Math.max(res, prices[j] - prices[i]);
                }
            }
            return res;
        }
    }
    

    复杂度分析:

    • 时间复杂度:O(N^2)
    • 空间复杂度:O(1);

    三、针对暴力枚举的优化

    我们发现:我们只关心之前(不包括现在)看到的最低股价,于是在遍历的过程中,记录下之前看到的最低股价,可以省去内层循环。(打擂台法)

    class Solution {
            public static int maxProfit(int[] prices) {
            
            if(prices.length<2){
                return 0;
            }
    
            //暴力枚举
            int minValue = prices[0];
            int res = 0;
            for (int i = 0; i < prices.length; i++) {
                res = Math.max(res, prices[i] - minValue);
                minValue = Math.min(minValue, prices[i]);
            }
            return res;
        }
    }
    

    复杂度分析:

    • 时间复杂度:O(N)
    • 空间复杂度:O(1);
  • 相关阅读:
    js判断手机端Android手机还是iPhone手机
    网站中增加微信公众账号链接的方法
    人人网的账号登录及api操作
    腾讯微博的账号登录及api操作
    QQ的账号登录及api操作
    新浪微博的账号登录及api操作
    开心网的账号登录及api操作
    豆瓣的账号登录及api操作
    判断手机旋转代码 屏幕旋转的事件和样式
    jQuery实现长按按钮触发事件的方法
  • 原文地址:https://www.cnblogs.com/ysw-go/p/11847338.html
Copyright © 2020-2023  润新知