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