買賣股票的最佳時機 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; } };