iT邦幫忙

0

leetcode 365天 #Day125 && 新計劃

  • 分享至 

  • xImage
  •  

至今邁入了125天,寫的題數也超過500題了,對此我為自己新增了更多的「作業」。
除了繼續寫題目以外,我想開始製作講解題目的影片,而且希望品質可以好一點,不可像文章一樣,敘述過短。
而這日更的文章應該也會邁向尾聲,除了需要多點時間講解以外,我發現技術文章的區塊似乎被我洗版了,這是我所不樂見了,所以要收斂一點XD
↓這是我的新作業的前言
Yes

↓這是Day125
Yes


  1. Unique Binary Search Trees (medium)

https://leetcode.com/problems/unique-binary-search-trees/description/
Submission:https://leetcode.com/problems/unique-binary-search-trees/submissions/861813530/
Given an integer n, return the number of structurally unique BST's (binary search trees) which has exactly n nodes of unique values from 1 to n.

大魔王,這題對我而言是個魔王。
這題要幹嘛呢?簡單來說就是會給n個節點val值會是1~n,然後問說可以組合出多少個BST。
看起來很簡單,但第一次寫的時候真的完全沒頭緒

class Solution:
    #要回傳「正確的BST」數量
    #我現在才注意到是會固定一個range的數字
    #1~n

    #假設root為i
    #則左邊為1~i-1,右邊為i+1~n
    #             i
    #       /          \
    #   run(i-1)     run(n-i)
    
    # C0 = 1
    # C(n+1) = (西格瑪i=0~n)Ci*Cn-i,n>=0
    #去查資料才找到卡特蘭數這東西。
    def numTrees(self, n: int) -> int:
        dp = [0]*20
        dp[0],dp[1] = 1,1
        for i in range(2,n+1):
            for j in range(1,i+1):
                dp[i] = dp[i] + dp[j-1]*dp[i-j]#因10~12行推斷
        return dp[n]

  1. Ugly Number II (medium)

https://leetcode.com/problems/ugly-number-ii/description/
Submission:https://leetcode.com/problems/ugly-number-ii/submissions/861800141/

An ugly number is a positive integer whose prime factors are limited to 2, 3, and 5.
Given an integer n, return the nth ugly number.
給一個數字n,要找出第n小的ugly number

這題我思考的思路為兩個,一個是反過來做,一個是正著做,不過反過來做的失敗了,應該還有機會改好,但有點懶就先放著XD

class Solution:
    #找出第n個ugly number
    #ugly number:質因數只有2 3 5
    #我猜一定TLE的方法所以不想寫:for到底每個數字都判斷過一遍即可
    #當然你也可以先用電腦爬好然後查表,但這種沒意義行為等解完這題再說

    #反思維思考呢?如果我檢查的是有沒有含其他質數呢?
    #TLE,我後悔花時間在這了,還是我沒考慮好呢?
    #然後配合class的特性使用dp就可以不用每次都重新讀取
    #不過比較尷尬的一件事情,他的n是只說第n大的數字,所以我不能直接代n
    dpPrime = [7]
    def nthUglyNumber(self, n: int) -> int:
        def checkPrime(num):
            if num % 2 == 0:
                return 0
            for j in range(3,int(num**(1/2))+1,2):
                if num % j == 0:
                    return 0
            else:
                return 1
        ansL = []
        i = 1
        while len(ansL)<n:
            if i > self.dpPrime[-1] and checkPrime(i):
                self.dpPrime.append(i)
                i+=1
                continue
            if self.dpPrime:
                flag = 1
                for prime in self.dpPrime:
                    if i%prime == 0:
                        flag = 0
                        break
                    elif prime >= i:
                        break
                if flag:
                    ansL.append(i)
            i+=1
        # print(ansL)
        return ansL[-1]
class Solution:
    #看來還是這樣做最簡單
    #下次做這題的時候來想一下更好的寫法
    #簡單來說就是慢慢地找出更大的數字
    #那為了這樣找,所以就要決定一個機制就是下一個要乘上誰
    #那因為每個數字都會是2,3,5的倍數
    #所以就慢慢地用索引值把2,3,5當成因數代進去
    def nthUglyNumber(self, n: int) -> int:
        ansL = [1]
        aindex,bindex,cindex = 0,0,0#先都以0為起始
        tempMin = -float("inf")
        while len(ansL) < n:
            a,b,c = ansL[aindex]*2,ansL[bindex]*3,ansL[cindex]*5
            if a<=b and a<=c:
                tempMin = a
                aindex += 1
            elif b<=a and b<=c:
                tempMin = b
                bindex += 1
            elif c<=a and c<=b:
                tempMin = c
                cindex += 1
            if tempMin in ansL:
                continue
            ansL.append(tempMin)
        print(ansL)
        return ansL[-1]

以上為今天的練習,感謝


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言