2021年6月底--7月3日,拼多多搜索廣告算法暑假實習面試題2道

這是我參與8月更文挑戰的第2天,活動詳情查看:8月更文挑戰node

1. 算法題leetcode 687. 最長同值路徑

方法:遞歸面試

能夠將任何路徑(具備相同值的節點)看做是最多兩個從其根延伸出的箭頭。具體地說,路徑的根將是惟一節點,所以該節點的父節點不會出如今該路徑中,而箭頭將是根在該路徑中只有一個子節點的路徑。而後,對於每一個節點,咱們想知道向左延伸的最長箭頭和向右延伸的最長箭頭是什麼?咱們能夠用遞歸來解決這個問題。算法

令 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

2. 算法題leetcode 322. 零錢兌換

徹底揹包問題——填滿容量爲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)

相關文章
相關標籤/搜索