美文网首页数据结构和算法分析程序员
leecode刷题(2)-- 买卖股票的最佳时机

leecode刷题(2)-- 买卖股票的最佳时机

作者: 希希里之海 | 来源:发表于2019-01-16 13:43 被阅读15次

    leecode刷题(2)-- 买卖股票的最佳时机

    买卖股票的最佳时机

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

    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例:

    输入: [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
    随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

    代码如下:

    public class MaxProfit {
        public int maxProfit(int[] prices) {
            if (prices == null || prices.length == 0) {
                return 0;
            }
            int profit = 0;
            for (int i = 1; i < prices.length; i++) {
                if (prices[i-1] < prices[i]) {
                    profit += prices[i] - prices[i-1];
                }
            }
            return profit;
        }
    
        public static void main(String[] args) {
            int[] a = {1,2,3,4,9};
            MaxProfit profit = new MaxProfit();
            int maxProfit = profit.maxProfit(a);
            System.out.println(maxProfit);
        }
    }
    

    算法:贪心算法(局部最优解即为整体最优解)

    比如我们假定数组为 [7, 1, 5, 3, 6, 4]

    依照题目规定,要获得最大值的话,要求相邻子数组的差应该大于或等于0(这样才能“低买高卖”),也就是说,这个连续子数组应该是递增的。

    我们还是来看例子,依据“低买高卖”的原则,我们可以得到两种结果:

    (1) profit1 = (5-1) + (6-3) = 7

    (2) profit2 = (6-1) = 5

    第一种结果为相邻比大小并相减并连续求和,第二种为找到最大和最小值相减(遵循“低买高卖”),明显第一种更符合题目利益最大化的要求。

    image

    然后我们继续优化,可以在数值递增的过程中连续取差值求和,而不用在数值停止递增找到最大值,这样我们的子数组便都是递增的了。如果子数组中的第二个数字大于第一个数字,我们便能获得该子数组的最大利润,推广到整个数组,我们将获得的总和将是最大利润。这便是贪心算法。

    image

    复杂度

    • 时间复杂度:O(n) 。遍历一次。
    • 空间复杂度:O(1) 。需要常量的空间。

    相关文章

      网友评论

        本文标题:leecode刷题(2)-- 买卖股票的最佳时机

        本文链接:https://www.haomeiwen.com/subject/fdhmdqtx.html