买卖股票的最佳时机 II
假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
给出一个数组样例[2,1,2,0,1], 返回 2
解题
参考买卖股票的最佳时机I ,求出相邻两天的股票差值,当差值大于0的时候,完成一次交易。当连续一段的交易,可以理解为:该连续交易的起始是购买,连续交易的结束时卖出。这样求出的就是一个子段的最大值。对所有的子段求和就是答案了。
对这个子数组:
相邻元素差的数组:
假设这个起始交易的利润最大:,这个值也就等于上面数组的和
如何判断这个子数组的起始位置?
我们要求的是相邻子数组的的差应该大于等于0,,或者说:这个连续子数组 应该是递增的
通过求其差值是否大于等于0,很好判断是否是递增的。如果直接判断递增,可以通过两层循环,同时第二次循环结束点,又是第一层循环的起始点。
通过相邻元素的差值判断:
class Solution { /** * @param prices: Given an integer array * @return: Maximum profit */ public int maxProfit(int[] prices) { // write your code here if(prices == null) return 0; int sum = 0; for(int i =0;i< prices.length - 1;i++){ if(prices[i] < prices[i+1]) sum += prices[i+1] - prices[i]; } return sum; } };
1 class Solution: 2 """ 3 @param prices: Given an integer array 4 @return: Maximum profit 5 """ 6 def maxProfit(self, prices): 7 # write your code here 8 sum = 0 9 if prices == None: 10 return sum 11 for i in range(len(prices) - 1): 12 if prices[i] < prices[i+1]: 13 sum += prices[i+1] - prices[i] 14 return sum
while循环找出连续递增子数组:
class Solution { /** * @param prices: Given an integer array * @return: Maximum profit */ public int maxProfit(int[] A) { // write your code here if(A == null || A.length == 0) return 0; if(A.length == 1) return 0; int sum=0; int i = 0; int j = 0; while(i < A.length && j < A.length){ while(j<A.length-1 && A[j] <= A[j+1]) j++; // 跳出循环的j 是满足递增序列的最后一个位置 if(j == A.length -1){ // 最后一个元素,结束了 sum += A[j] - A[i]; break; }else{ sum += A[j] - A[i]; } i = j + 1;// 下一个位置从新开始 j = j + 1; } return sum; } };