买卖股票的最佳时机

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

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

	// 遍历两次
	public int maxProfit01(int[] prices)
	{
		int profit = Integer.MIN_VALUE; // 利润
		int maxProfit = 0; // 最大利润
		for (int i=0; i<prices.length; i++)
		{
			for (int j=i+1; j<prices.length; j++)
			{
				profit = prices[j] - prices[i];
				maxProfit = maxProfit > profit? maxProfit:profit;
			}
		}
		
		return maxProfit;
	}
	// 遍历一次
	public int maxProfit02(int[] prices)
	{
		int minPrice = Integer.MAX_VALUE;  
		int maxProfit = 0; // 最大利润
		for (int i=0; i<prices.length; i++)
		{
			if (prices[i] < minPrice)
				minPrice = prices[i];
			else if (prices[i] - minPrice > maxProfit)
				maxProfit = prices[i] - minPrice;
		}
		return maxProfit;
	}
	// 动态规划
	// 前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}
	public int maxProfit(int[] prices)
	{
		if (prices == null || prices.length <= 1)
			return 0;
		
		int[] dayProfit = new int[prices.length];
		dayProfit[0] = 0; // 第一天的最大收入
		int minPrice = Integer.MAX_VALUE;  

		for (int i=1; i<prices.length; i++)
		{
			// 前i-1天的 最小价格
			if (prices[i-1] < minPrice)
				minPrice = prices[i-1];
			dayProfit[i] = Math.max(dayProfit[i-1], prices[i]-minPrice);
		}
		return dayProfit[prices.length-1];
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值