买卖股票的最佳时机II

本文详细解析了四种不同的算法,用于解决如何从股票价格数组中计算出最大交易利润的问题。这些算法包括通过查找买入和卖出时机的迭代方法,以及利用递归和简化逻辑的策略,帮助读者理解并掌握高效计算股票交易利润的技巧。
摘要由CSDN通过智能技术生成

问题描述: 

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

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

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

 

思路: 我的解题思路是先找出买入股票的那一天,然后找到卖出股票的那一天,接着重复这个过程。

解法一:

public static int maxProfit(int[] prices) {
		if(prices == null || prices.length <= 1)
			return 0;
		int buy = -1;
		int maxProfix = 0;
		for(int i = 0; i<prices.length-1;){
			if(prices[i] < prices[i+1]){ // 找到买入股票的那一天
				buy = i;
			}else{
				i++;
				continue;
			}
			if(buy == -1) // 没有找到直接返回
				return maxProfix;
			for(int j = buy+1; j<prices.length; j++){ // 寻找卖出股票的时机
				if(j == (prices.length-1)){ // 最后一天
					maxProfix += (prices[j] - prices[buy]);
					i = j; // 跳出外循环
					break;
				}
				if(prices[j+1] < prices[j]){ 
					int tmp = prices[j] - prices[buy];
					maxProfix += tmp;
					i = (j+1); // 重新定位买入股票的时机
					break;
				}
			}
		}
		return maxProfix;
	}

解法二:

精简后的代码如下:

public static int maxProfit2(int[] prices) {
		int profit = 0;
		int i = 0;
		while(i<prices.length-1){
			while(i<prices.length-1 && prices[i] >= prices[i+1]) i++;
			int buyPrice = prices[i];
			while(i<prices.length-1 && prices[i+1] >= prices[i]) i++;
			profit += prices[i] - buyPrice;
		}
		return profit;
	}

 

解法三:

看了下别人的代码,大体思路也是找出买入的天数和卖出的天数,不过是用递归实现的:

public static int maxProfit3(int[] prices) {
		return maxProfitRec(prices,0);
	}
	private static int maxProfitRec(int[] prices, int start){
		int last = prices.length - 1;
		while((start < last) && (prices[start] >= prices[start+1])){
			start++; // 买入
		}
		int end = start;
		while((end < last) && (prices[end] < prices[end+1])){
			end++; // 卖出
		}
		if(start == end)
			return 0;
		int profit = prices[end] - prices[start];
		return profit + maxProfitRec(prices, end);
	}

解法四:

也可以遍历数组,一发现前后两天有利益就进行买入卖出,这个其实是上一种思路的一种变体:

public int maxProfit(int[] prices) {
        int maxprofit = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] > prices[i - 1])
                maxprofit += prices[i] - prices[i - 1];
        }
        return maxprofit;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值