zoukankan      html  css  js  c++  java
  • 买卖*最佳时机

    给定一个数组,它的第 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。

    暴力解决方法:定义max表示获取最大值,min表示当前遍历的最小值。遍历数组,找出第一个arr[i]<arr[i+1]的arr[i],将它作为最小值min = arr[i],此时max = arr[i+1]-arr[i];
    继续遍历如果此时arr[i]<arr[i+1]并且arr[i]<min,我们将arr[i]赋给min,然后取max = Math.max(max,arr[i+1]-min);
    如果此时arr[i]<arr[i+1]max = Math.max(max,arr[i+1]-min);最后返回max
    代码如下:
    public int maxProfit(int[] arr) {
            int len = arr.length;
            if(len == 0) return 0;
            //表示当前遍历数组中最小值
            int min = 0;
            //作为标记
            int count = 0;
            //获取的最大利润
            int max = 0;
            for(int i = 0;i<len-1;i++){
                //找出第一个arr[i]<arr[i+1]的arr[i]
                if(arr[i]<arr[i+1] && count == 0){
                    min = arr[i];
                    count++;
                    max = arr[i+1] - arr[i];
                }
                //找到arr[i]<arr[i+1]并且arr[i]<min,将arr[i]赋给min,再次计算此时的最大利润
                else if(arr[i]<arr[i+1] && arr[i]<min){
                    min = arr[i];
                    max = Math.max(max,arr[i+1] - min);
                }
            //计算此时的最大利润
           else if(arr[i]<arr[i+1]){ max = Math.max(max,arr[i+1] - min); } } return max; }

    上面代码优化一下:可采用动态规划的方法去做,思想和暴力法一样,代码优化了

    代码如下:

    public int maxProfit(int[] arr) {
            int len = arr.length;
            if(len == 0) return 0;
            //表示当前遍历数组中最小值
            int min = arr[0];
            //获取的最大利润
            int max = 0;
            for(int i = 0;i<len;i++){
                max = Math.max(max,arr[i] - min);
                min = Math.min(min,arr[i]);
            }
            return max;
        }


  • 相关阅读:
    mybatis中 无效的比较: invalid comparison: java.util.Date and java.lang.String
    java中日期的加减,比较,以及与String的互相转换
    Java中文件上传下载 --使用Minio
    Dubbo SPI 源码深入分析
    新建Maven项目 发布服务 注册到zookeeper
    Dubbo SPI 源码分析
    思维方法
    JDK 和 Dubbo SPI 的入门浅析Demo
    Dubbo不用注册中心实现远程调用的简单用法demo
    解决linux系统下tar解压文件报错问题
  • 原文地址:https://www.cnblogs.com/du001011/p/10870973.html
Copyright © 2011-2022 走看看