lintcode:買賣股票的最佳時機 II


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

 

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;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM