周賽304。不知道為什麼無法理解題目描述,還以為要node1盡可能多走,node2盡可能少走。等了一小時才開竅,真想打死我自己。
真心希望這種較大較小的關係可以用公式來表達,不然至少句子短一點。

題目

輸入一個n節點的有向圖,節點編號從0到n-1,每個節點最多有一條出邊。 另有長度為n的整數陣列edges,其中edges[i]代表節點i的到edges[i]存在一條有向出邊。若沒有出邊則edges[i]為-1。

另外還有兩個整數node1和node2。
找到某個節點,同時可以從node1和node2出發而抵達,且node1和該節點的距離node2和該節點的距離的較大值最小化。若有多個符合的節點,則選擇索引較小者。若不存在則回傳-1。

請注意,圖中可能包含循環。

解法

理解題意之後其實很簡單,分別從node1和node2出發,算出抵達各點的距離為多少。
之後遍歷每個節點,若從兩節點出發皆可抵達,則以兩距離取較大者mmx,再拿去和當前最大值mx比較,若小於mx則更新答案。

class Solution:
    def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int:
        N=len(edges)
        
        def f(i):
            dist=[-1]*N
            step=0
            curr=i
            while curr!=-1 and dist[curr]==-1:
                dist[curr]=step
                step+=1
                curr=edges[curr]
            return dist
        
        dist1=f(node1)
        dist2=f(node2)
        ans=-1
        mx=inf
        
        for i,(a,b) in enumerate(zip(dist1,dist2)):
            if a==-1 or b==-1:continue
            mmx=max(a,b)
            if mmx<mx:
                ans=i
                mx=mmx
            
        return ans
        

Tags:

Updated: