买卖*最佳时机

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


原文地址:https://www.cnblogs.com/du001011/p/10870973.html