LeetCode刻意练习--买卖股票的最佳时机

题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

理解题目:
因为我们要获得最大利益,就是在一个数组里找到一个最小值和一个最大值,并且最大值是在最小值的后面,然后最大值和最小值的差就是获得 的最大利益。

先用一个数组diff用于存储相邻元素之间的差。
那么这个问题就转换成找出一个数组中连续子序列的最大值!

找数组中连续子序列的最大值,则如果遇到是>0的元素则加起来,遇到小于 0的元素就停止。

代码如下:

 public int maxProfit(int[] prices) {
        int length=prices.length;
        //数组中没有元素或只有一个元素,利润只能是0
        if(length==0||length==1)
        return 0;
        //用diff存储相邻两个元素之间的差
        int[] diff=new int[length-1];
        for(int i=0;i<length-1;i++)
        {
            diff[i]=prices[i+1]-prices[i];
        }
        //寻找最大子序列和
        int maxdiff=diff[0];
        for(int i=1;i<length-1;i++)
        {
            if(diff[i-1]>0)
                diff[i]+=diff[i-1];
            if(diff[i]>maxdiff)
                maxdiff=diff[i];
        }
        //如果最大子序列和小于0,说明无论怎么买都会亏本,那不买的时候利润就是最大的
        if(maxdiff<0)
        return 0;
        
        return maxdiff;
    }

发布了49 篇原创文章 · 获赞 2 · 访问量 868

猜你喜欢

转载自blog.csdn.net/qq_43720551/article/details/105103828