1. 程式人生 > >LeetCode演算法題-Best Time to Buy and Sell Stock II

LeetCode演算法題-Best Time to Buy and Sell Stock II

這是悅樂書的第173次更新,第175篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第32題(順位題號是122)。假設有一個數組,其中第i個元素是第i天給定股票的價格。設計演算法以找到最大利潤。可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)。

注意:不能同時進行多筆交易(即,您必須在再次購買之前賣出股票)。

例如:

輸入:[7,1,5,3,6,4]
輸出:7

說明:在第2天買入(價格= 1)並在第3天賣出(價格= 5),利潤= 5-1 = 4。然後在第4天買入(價格= 3)並在第5天賣出(價格= 6),利潤= 6-3 = 3。

輸入:[1,2,3,4,5]
輸出:4

說明:在第1天買入(價格= 1)並在第5天賣出(價格= 5),利潤= 5-1 = 4。請注意,您不能在第1天購買,在第2天購買並在以後出售,就像您一樣同時參與多個交易。您必須在再次購買之前出售。

輸入:[7,6,4,3,1]
輸出:0

說明:在這種情況下,不進行任何交易,即最大利潤= 0。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 解題

特殊情況一:當傳入的陣列為null時,直接返回0。

特殊情況二:當傳入的陣列不為null,但是其內只有0個或者1個元素時,無法支援買入並賣出操作,直接返回0。

正常情況:比之昨天的只能做一次交易,今天這道題可以進行多次交易,來求得最大利潤,只要符合低買高賣,利潤肯定是會大於0的。如果新的一天的價格比前一天的價格,兩者之差就是利潤,任意兩個相鄰的價格只要符合這個規則,都可以算作利潤,並且題目也沒有說賣出的當天不能再買入,所以依次比較相鄰兩元素並求差即可。

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


03 小結

此題的解法只用了一層迴圈,因此時間複雜度是O(n);此題只建立了一個變數,因此空間複雜度是O(1)

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!