数据结构和算法分析程序员

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

2019-01-16  本文已影响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

复杂度

上一篇下一篇

猜你喜欢

热点阅读