LeetCode演算法題-Best Time to Buy and Sell Stock
這是悅樂書的第172次更新,第174篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第31題(順位題號是121)。假設有一個數組,其中第i個元素是第i天給定股票的價格。如果只被允許完成最多一筆交易(即買入並賣出一股股票),請設計演算法以找到最大利潤。請注意,在購買之前不能出售股票。例如:
輸入:[7,1,5,3,6,4]
輸出:5
說明:在第2天買入(價格= 1)並在第5天賣出(價格= 6),利潤= 6-1 = 5。不是7-1 = 6,因為售價需要大於購買價格。
輸入:[7,6,4,3,1]
輸出:0
說明:在這種情況下,不進行任何交易,即最大利潤= 0。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 解題
特殊情況一:當傳入的陣列為null時,直接返回0。
特殊情況二:當傳入的陣列不為null,但是其內只有0個或者1個元素時,無法支援買入並賣出操作,直接返回0。
正常情況:要想股票獲利,需要滿足低買高賣的條件,否則不獲利甚至虧損。先將第1天的價格單獨拿出來,接著開始遍歷陣列(從第二個元素開始遍歷),如果第二天的價格高於第一天的價格,此時的最大利潤是第二天的價格減去第一天的價格與最大利潤初始值之間的最大值,否則買入價格就應該換成第二天的價格,依次向後迴圈,直到比較完所有的價格。最後,如果最大利潤大於0,此時最大利潤就是其本身,否則最大利潤為0。
public int maxProfit(int[] prices) { if (prices == null || prices.length <= 1) { return 0; } int maxProfit = Integer.MIN_VALUE; int buyPrice = prices[0]; for (int i=1; i < prices.length; i++) { if (prices[i] > buyPrice) { maxProfit = Math.max(maxProfit, prices[i]-buyPrice); } else { buyPrice = prices[i]; } } if (maxProfit > 0) { return maxProfit; } return 0; }
對於上面的最大利潤的初始值,也可以設為0,最後直接返回最大利潤即可,就無需再加多一步判斷了。
03 小結
此題的解法只用了一層迴圈,因此時間複雜度是O(n);此題只建立了兩個變數,因此空間複雜度是O(1)。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!