1、寫在前面面試
爲何要在LeetCode刷題?你們都知道不論是校招仍是社招算法題是必考題,而這一部分恰巧是大多數人的短板,因此刷題首先是爲了提升自身的編程能力,可以在算法面試中脫穎而出,拿到滿意的offer。本身是打算考研的,計算機考研數據結構也是必考題,因此刷題的第二個緣由就是爲了鞏固本身的數據結構知識。算法
應該如何刷題呢?這兩個月本身是順序刷題的,可是總結的時候發現知識點太零散,前二十題有棧,鏈表,數組等等,本身總結的時候沒有造成一個完整的體系,也沒有清晰的分類,這不是本身想要的,因此本身後期刷題將採用專題的方式,好比數組,鏈表,二叉樹等等。編程
那麼第一個專題就是貪心算法。前20題連接【LeetCode】彙總貼(NO.1-20)數組
本身建了一個LeetCode刷題羣,交流本身的刷題心得,如今尚未到達預約的人數,感興趣的小夥伴能夠參加哦,我的微信:wxb950917。微信
爲面試而生,期待你的加入。
2、什麼是貪心算法數據結構
貪心算法在LeetCode共有41個題目,以中等難度居多。那麼什麼是貪心算法呢?機器學習
貪心算法(又稱貪婪算法)是指,在對問題求解時,老是作出在當前看來是最好的選擇。也就是說,不從總體最優上加以考慮,他所作出的是在某種意義上的局部最優解。學習
貪心算法每一步必須知足一下條件:設計
一、可行的:即它必須知足問題的約束。3d
二、局部最優:他是當前步驟中全部可行選擇中最佳的局部選擇。
三、不可取消:即選擇一旦作出,在算法的後面步驟就不可改變了。
學習貪心算法的時候能夠結合動態規劃一塊兒來學習,二者仍是很類似的。
3、今日題目
買賣股票的最佳時機 II(122)
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能得到利潤 = 6-3 = 3 。
示例 2:
輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接連購買股票,以後再將它們賣出。 由於這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉以前的股票。
示例 3:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲 0。
4、題目分析
貪心算法,老是作出在當前看來是最好的選擇,不從總體最優上加以考慮,也就是說,只關心當前最優解,按照貪心策略,不關心之後,咱們只關心當前利益。第0天買入,花費prices[0],第一天賣出,獲得prices[1],那麼咱們的收穫就是profit = prices[1] - prices[0],那麼有兩種狀況
(1)當profit > 0 時,趕忙買入賣出,能賺一筆是一筆。
(2)當profit <= 0 時,再買入賣出的話,那就是傻了,虧錢。
以此方式類推下去,即得最大利潤。
5、代碼實現
class Solution:
def maxProfit(self, prices): """ :type prices: List[int] :rtype: int """ profit = 0 temp=0 for i in range(1,len(prices)): temp=prices[i] - prices[i-1] if temp>0: profit+=temp return profit
【推薦閱讀】