這是我參與8月更文挑戰的第2天,活動詳情查看:8月更文挑戰node
方法:遞歸面試
能夠將任何路徑(具備相同值的節點)看做是最多兩個從其根延伸出的箭頭。具體地說,路徑的根將是惟一節點,所以該節點的父節點不會出如今該路徑中,而箭頭將是根在該路徑中只有一個子節點的路徑。而後,對於每一個節點,咱們想知道向左延伸的最長箭頭和向右延伸的最長箭頭是什麼?咱們能夠用遞歸來解決這個問題。算法
令 arrow_length(node) 爲從節點 node 延伸出的最長箭頭的長度。若是 node.Left 存在且與節點 node 具備相同的值,則該值就會是 1 + arrow_length(node.left)。在 node.right 存在的狀況下也是同樣。數組
當咱們計算箭頭長度時,候選答案將是該節點在兩個方向上的箭頭之和。咱們將這些候選答案記錄下來,並返回最佳答案。markdown
代碼以下:oop
class Solution(object):
def longestUnivaluePath(self, root):
self.ans = 0
def arrow_length(node):
if not node: return 0
left_length = arrow_length(node.left)
right_length = arrow_length(node.right)
left_arrow = right_arrow = 0
if node.left and node.left.val == node.val:
left_arrow = left_length + 1
if node.right and node.right.val == node.val:
right_arrow = right_length + 1
self.ans = max(self.ans, left_arrow + right_arrow)
return max(left_arrow, right_arrow)
arrow_length(root)
return self.an
複製代碼
時間複雜度:O(N),其中 N 是樹中節點數。post
空間複雜度:O(H),其中 H 是樹的高度。spa
更全更新面試題見,七月在線面試題庫>>>www.julyedu.com/questions/w…code
徹底揹包問題——填滿容量爲amount的揹包最少須要多少硬幣orm
dp[j]表明含義:填滿容量爲j的揹包最少須要多少硬幣
初始化dp數組:由於硬幣的數量必定不會超過amount,而amount <= 10^4,所以初始化數組值爲10001;dp[0] = 0
轉移方程:dp[j] = min(dp[j], dp[j - coin] + 1)
當前填滿容量j最少須要的硬幣 = min( 以前填滿容量j最少須要的硬幣, 填滿容量 j - coin 須要的硬幣 + 1個當前硬幣)
返回dp[amount],若是dp[amount]的值爲10001沒有變過,說明找不到硬幣組合,返回-1
代碼以下:
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [0] + [10001] * amount
for coin in coins:
for j in range(coin, amount + 1):
dp[j] = min(dp[j], dp[j - coin] + 1)
return dp[-1] if dp[-1] != 10001 else -1
複製代碼
時間複雜度:O(n * amount)
空間複雜度:O(amount)