LeetCode:121. 买卖股票的最佳时机暴力解法和动态规划

741 阅读1分钟

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/be… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力解法:因为只能买卖一次,故可依次循环,找到最优解即可 实现代码:

/**
	 * 买卖股票的最佳时机:只能买卖一次
	 * 		暴力解法
	 * 【例子】:[7,1,5,3,6,4]
	 * @param prices
	 * @return
	 */
	public static int maxProfit_violence(int[] prices) {
		int maxProfit = 0;
		for (int i = 0; i < prices.length; i++) {
			for (int j = i+1; j < prices.length; j++) {
				if (prices[j] - prices[i] > maxProfit) {
					maxProfit = prices[j] - prices[i];
				}
			}
		}
		return maxProfit;
    }

动态规划解法:解题思路: s1: 记录今天之前买入的最小值 s2: 计算今天卖出的最大获利 s3: 比较每天的最大获利

代码:

/**
	 * 买卖股票的最佳时机:只能买卖一次
	 * 		动态规划解决
	 * 【例子】:[7,1,5,3,6,4]
	 * 
	 *  解题思路:
	 *  s1: 记录今天之前买入的最小值
	 *  s2: 计算今天卖出的最大获利
	 *  s3: 比较每天的最大获利
	 * 
	 * @param prices
	 * @return
	 */
	public static int maxProfit_dynamic(int[] prices) {
		if (prices.length <= 1) {
			return 0;
		}
		int maxProfit = 0;
		int min = prices[0];
		for (int i = 0; i < prices.length; i++) {
			maxProfit = Math.max(maxProfit, prices[i] - min);
			min = Math.min(min, prices[i]);
		}
		return maxProfit;
    }