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

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

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

复杂度

  • 时间复杂度:O(n) 。遍历一次。
  • 空间复杂度:O(1) 。需要常量的空间。
posted @ 2018-12-18 21:11  希希里之海  阅读(185)  评论(0编辑  收藏  举报