WEEK3

leetcode :
no_62:


image.png

思路:
本題暴力遞歸去遍歷所有情況會超時
如果發(fā)現(xiàn) result(m,n) = result(m-1,n) + result(m,n-1) 這個特征式子就好做了

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        dp = []
        for i in range(n):
            dp.append([])
            for j in range(m):
                dp[i].append(0)
        for i in range(m):
            dp[0][i] = 1
        for i in range(n):
            dp[i][0] = 1
        for i in range(1,n):
            for j in range(1,m):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[-1][-1]
        

no_121:

image.png

思路:類似游標毕源,以一個start來記錄假定的買入亮隙,單次循環(huán)撕彤,通過判定當前股票價格與假定的買入價格的大小來修改start灰嫉,如果當前值小于start處的值节仿,更新start巢块,假定在此處買入;如果當前的值大于start處的值护桦,得出一個假定的收益量含衔,存入benifit中,最終去benifit中取max就是最大的利益

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if prices == []:
            return 0
        benifit = []
        start = 0
        for i in range(len(prices)):
            if prices[i] - prices[start] < 0:
                start = i
                benifit.append(0)

            else:
                benifit.append(prices[i] - prices[start])
        return max(benifit)

no_122:


image.png

思路:因為沒有任何限制調價二庵,那么把所有的上漲都納入收益那就是那就是最大收益

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if prices == []:
            return 0
        # start = 0
        allBenifit = 0
        for i in range(len(prices)):
            if i!=0:
                if prices[i] > prices[i-1]:
                    allBenifit+=(prices[i]-prices[i-1])
                

        return allBenifit

no_123:


image.png

思路: 動態(tài)規(guī)劃的思想贪染。dp表示最大收益量,應該有三個維度:
第一個維度記錄天數(shù)催享,第二個維度記錄當前是否持有股票杭隙,第三個維度記錄當前已經賣出股票的次數(shù)。狀態(tài)轉移方程如代碼所示因妙,最終的最大值應該滿足(最后一天痰憎,手上不持有股票,已經完成一次或者兩次交易攀涵,不小于0) 等幾個條件铣耘。注意邊界值。

class Solution(object):
   def maxProfit(self, prices):
      if prices == []:
          return 0
      dp = [[[0,0,0],[0,0,0]] for i in range(len(prices))]
      dp[0][0][0] = 0

      dp[0][1][0] = - prices[0]

      for item in dp[0]:
          for j in range(len(item)):
              if j > 0 :
                  item[j] = float('-inf')

      for i in range(1,len(prices)):
           dp[i][0][0] = 0
           dp[i][0][1] = max (dp[i-1][1][0] + prices[i] , dp[i-1][0][1])
           dp[i][0][2] = max(dp[i-1][1][1] + prices[i],dp[i-1][0][2])
           dp[i][1][0] = max(dp[i-1][0][0] - prices[i],dp[i-1][1][0])
           dp[i][1][1] = max(dp[i-1][0][1] - prices[i],dp[i-1][1][1])
           dp[i][1][2] = float('-inf')
       
      return max(0,dp[len(prices)-1][0][1],dp[len(prices)-1][0][2])

no_188: 買賣股票的最佳時機 4


image.png

思路:
這個也可以用類似于上一提的三維dp來做以故,區(qū)別在于最后一個維度應該時k+1維的蜗细,表示賣出了0次 - k次。
問題:會超出空間限制。
解決:把 k > len(prices) / /2 的情況拎出來討論炉媒,此時交易次數(shù)足夠大踪区,用第122題的方法去解決即可。

class Solution(object):
    def maxProfit(self, k, prices):
        """
        :type k: int
        :type prices: List[int]
        :rtype: int
        """
        def noK(prices):
            start = 0
            allBenifit = 0
            for i in range(len(prices)):
                if i!=0:
                    if prices[i] > prices[i-1]:
                        allBenifit+=(prices[i]-prices[i-1])
            return allBenifit
        if prices == []:
            return 0
        if len(prices) == 1:
            return 0
        if k > len(prices) // 2:
            return noK(prices)
        dp = [[[0 for j in range(k+1)] for i in range(2)]for i in range(len(prices))]
        
        dp[0][0][0] = 0
        dp[0][1][0] = -prices[0]

        for item in dp[0]:
            for j in range(len(item)):
                if j>0:
                    item[j] = float('-inf')
        
        for i in range(1,len(prices)):
            dp[i][0][0] = 0
            dp[i][1][k] = float('-inf')
            for j in range(k+1):
                if j>0:
                    dp[i][0][j] = max(dp[i-1][1][j-1] + prices[i],dp[i-1][0][j])
                if j<k:
                    dp[i][1][j] = max(dp[i-1][0][j] - prices[i] , dp[i-1][1][j])
        
        return max(0,max(dp[len(prices)-1][0]))

no_309:


image.png

dp是一個二維的吊骤,第一個維度表示天數(shù)缎岗,第二個維度表示狀態(tài),有三個狀態(tài):1 手上沒有股票白粉,2 手上有股票 3 冷凍期

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if prices == [] :
            return 0
        dp = [[0,0,0] for i in range(len(prices))]
        dp[0][0] = -prices[0] # 第一天有股票
        dp[0][2] = 0
        dp[0][1] = 0
        for i in range(1,len(prices)):
            dp[i][0] = max(dp[i-1][2] - prices[i] , dp[i-1][0])
            dp[i][1] = dp[i-1][0] + prices[i]
            dp[i][2] = max(dp[i-1][1], dp[i-1][2])
        return max(dp[len(prices)-1][1],dp[len(prices)-1][2],0)

no_714:


image.png

跟前面的題類似的密强,出售時記得減去 fee 就行了

class Solution(object):
    def maxProfit(self, prices, fee):
        """
        :type prices: List[int]
        :type fee: int
        :rtype: int
        """
        if prices == []:
            return 0
        dp = [[0,0] for i in range(len(prices))]
        # dp[天數(shù)][0:手上無股票,1:手上有股票]
        dp[0][0] = 0
        dp[0][1] = -prices[0]
        for i in range(1,len(prices)):
            dp[i][0] = max(dp[i-1][1] + prices[i] - fee , dp[i-1][0])
            dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i])
        
        return max(0,dp[len(prices)-1][0])

這周的leetcode題目很多涉及動態(tài)規(guī)劃蜗元,感覺比前面兩周的難了不少。

聽課筆記:


[圖片上傳中...(32E631195713FF104B80067090B66E07.png-2b591e-1595742934999-0)]
[圖片上傳中...(F6819C257F7D75C322CE8B86B656EF5B.png-d534c-1595742962124-0)]
F6819C257F7D75C322CE8B86B656EF5B.png
81CE204E5F08391EDF55FD539EB884F4.png
350EF316A72F41EB9EBB8007F5E5EF2C.png
8685A84C65F33609832DF624A19F73FF.png
D31D67B1C8432E478E93EBD987E64811.png

去網上找了吳恩達老師的課后編程練習系冗。跟著敲了 邏輯回歸 和 單層神經網絡 的代碼奕扣,去理解代碼邏輯。
發(fā)現(xiàn)有些相關知識掌握不夠掌敬,如numpy以及matplotlib.pyplot惯豆,去學了一些numpy的用法,并做了相關筆記
http://www.reibang.com/p/a5c8882864af

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奔害,一起剝皮案震驚了整個濱河市楷兽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌华临,老刑警劉巖芯杀,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雅潭,居然都是意外死亡揭厚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門扶供,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筛圆,“玉大人,你說我怎么就攤上這事椿浓√” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵扳碍,是天一觀的道長提岔。 經常有香客問我,道長左腔,這世上最難降的妖魔是什么唧垦? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮液样,結果婚禮上振亮,老公的妹妹穿的比我還像新娘巧还。我一直安慰自己,他們只是感情好坊秸,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布麸祷。 她就那樣靜靜地躺著,像睡著了一般褒搔。 火紅的嫁衣襯著肌膚如雪阶牍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天星瘾,我揣著相機與錄音走孽,去河邊找鬼。 笑死琳状,一個胖子當著我的面吹牛磕瓷,可吹牛的內容都是我干的。 我是一名探鬼主播念逞,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼困食,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翎承?” 一聲冷哼從身側響起硕盹,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叨咖,沒想到半個月后瘩例,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡芒澜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年仰剿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴晦。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡南吮,死狀恐怖,靈堂內的尸體忽然破棺而出誊酌,到底是詐尸還是另有隱情部凑,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布碧浊,位于F島的核電站涂邀,受9級特大地震影響,放射性物質發(fā)生泄漏箱锐。R本人自食惡果不足惜比勉,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浩聋,春花似錦观蜗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坊夫,卻和暖如春砖第,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背环凿。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工梧兼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人智听。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓袱院,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞭稼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345