leetcode 122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) beat 100%

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

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

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

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

 

 

leetcode 122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) beat 100%_第1张图片

 

 

思路:

这是一道很不错的贪心题,先假设买了第一个,然后和第二个比较,然后价格比前一个高就买出赚差价,如果价格比前一个低就假设第一个没买,直接更换到买了二个,这时基本的贪心思路就已经实现了。

可能有的人再想如果下下一个比下一个还要高价,那么不就不是最赚钱了,这里贪心的做法就很完美的等价解决了这个问题。我们想交易的实际上是第一个买入,第三个买出。可实际上,这个其实不就等价于第一个买入,第二个卖出,同时也第二个买入,第三个卖出。嗯~这里不理解的可以思考下,有更好的想法也可以和我交流

其实这种想法,还有一个最简略的等价代码,往下看~

 

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        if(n<=1)
        	return 0;
        int sum=0;
        int buy = prices[0];
        for(int i=1;i0)
        		sum+=prices[i] - buy;
        	buy = prices[i];
        }
        return sum;
    }
}

 

简略的等价代码,不停的地 使前一个和后一个继续差值计算,当然如果是负值就不进行交易,等于亏本就不交易嘛

 

此代码 beat 100% 

    //只要有差价就抛
    //100%
class Solution {
	public int maxProfit(int[] prices) {
		int maxProfit = 0;
		for (int i = 0; i + 1 < prices.length; i++) {
			if (prices[i + 1] - prices[i] > 0)
				maxProfit += prices[i + 1] - prices[i];
		}
		return maxProfit;
	}
}

 

 

 

你可能感兴趣的:(算法,面试,leetcode,算法,面试,leetcode)