LeetCode997-找到小鎮的法官

上次更新這個專欄還要追究到去年了

人太懶了,就一直把題目晾在一邊了

今年趕上了疫情,所以一直賦閒在家

想着幹些事情,就重新拾起了筆,繼續來更文章了

在家的每一天儘可能會更新文章

艾瑞巴蒂,我來了哈哈哈哈哈哈哈哈

最後,武漢加油,學校加油!


997-找到小鎮的法官

在一個小鎮裏,按從 1 到 N 標記了 N 個人。傳言稱,這些人中有一個是小鎮上的祕密法官。

如果小鎮的法官真的存在,那麼:

1)小鎮的法官不相信任何人。
2)每個人(除了小鎮法官外)都信任小鎮的法官。

只有一個人同時滿足屬性 1 和屬性 2 。

給定數組 trust,該數組由信任對 trust[i] = [a, b] 組成,表示標記爲 a 的人信任標記爲 b 的人。

如果小鎮存在祕密法官並且可以確定他的身份,請返回該法官的標記。否則,返回 -1。

示例 1:

輸入:N = 2, trust = [[1,2]]
輸出:2

示例 2:

輸入:N = 3, trust = [[1,3],[2,3]]
輸出:3

示例 3:

輸入:N = 3, trust = [[1,3],[2,3],[3,1]]
輸出:-1

示例 4:

輸入:N = 3, trust = [[1,2],[2,3]]
輸出:-1

示例 5:

輸入:N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
輸出:3

提示:

1 <= N <= 1000
trust.length <= 10000
trust[i] 是完全不同的
trust[i][0] != trust[i][1]
1 <= trust[i][0], trust[i][1] <= N

思路:

本題我採用了 兩種方法。第一種方法是借鑑了有向圖的入度數目判別,第二種方法其實和方法一差不多,步驟上精簡些。

方法一:有向圖的入度數目判別法

用一個字典用來記錄每個節點的入度,對應條件二,即所有人得相信法官。那麼,法官節點對應的入度應爲N-1;用一個集合記錄會信任他人的一羣人,對應條件一,即法官不能相信任何人,那麼法官不能在該集合中。

代碼如下:

class Solution(object):
    def findJudge(self, N, trust):
        """
        :type N: int
        :type trust: List[List[int]]
        :rtype: int
        """
        if not trust:
            return N
        # 該集合記錄會信任他人的一羣人,對應條件一,即法官不能相信任何人
        tmp = []
        # 該字典用來記錄每個節點的入度,對應條件二,即所有人得相信法官。
        # 那麼,法官節點對應的入度應爲N-1
        trust_dict = {}
        for node in trust:
            tmp.append(node[0])
            if node[1] not in trust_dict:
                trust_dict[node[1]] = 1
            else:
                trust_dict[node[1]] += 1
        # 遍歷tmp列表判斷條件一是否成立,遍歷trust_dict字典判斷條件二是否成立
        for people in trust_dict:
            if people not in tmp and trust_dict[people] == N-1:
                return people
        return -1


if __name__ == "__main__":
    N = 3
    trust = [[1,3],[2,3],[3,1]]
    print(Solution().findJudge(N, trust))

運行效率屬於中等吧,在54%左右。

方法二:

其實和方法一比較類似,只是方法一有兩次遍歷,方法二隻有一次遍歷。方法二也是首先創建一個字典trust_dict來記錄圖的邊集合,key值表示信任別人的人,value值列表集合表示當前people信任的一羣人,其實可以理解爲圖中所有有向無權邊的集合。

那麼如何檢查出法官呢?兩個條件:1)法官不在圖字典trust_dict的key值集合中;2)法官在其餘每個key值對應的value值中。

當然這其中還包含了一種特殊情況,就是給定的trust列表集合沒有給全N個人的信任關係,所以得再一些判斷,具體可見代碼。

代碼如下:

class Solution(object):
    def findJudge(self, N, trust):
        """
        :type N: int
        :type trust: List[List[int]]
        :rtype: int
        """
        trust_dict = self.createGraph(trust)
        # 當前變量用來記錄符合條件的法官
        Flag = -1
        # 遍歷每一個人,檢查是否符合法官的條件
        for people in range(1, N+1):
            # 如果有個people不在trust_dict字典對應的key值中,說明該people不信任任何人
            # 當然還有種情況就是該people不在trust列表中,即不信任任何人,也沒有任何人信任他
            if people not in trust_dict:
                for key, value in trust_dict.items():
                    # 如果當前people沒有被人信任,說明不是法官
                    if people not in value:
                        return -1
                # 此刻可能找到了符合法官條件的people,但還可能存在第二種情況,上面已解釋
                Flag = people
        return Flag
    
    # 創建無權重的有向圖,字典格式,其中value集合表示key值信任人的集合
    def createGraph(self, matrix):
        trust_dict = {}
        for trust in matrix:
            if trust[0] not in trust_dict:
                trust_dict[trust[0]] = []
            trust_dict[trust[0]].append(trust[1])
        return trust_dict


if __name__ == "__main__":
    N = 3
    trust = [[1,3],[2,3],[3,1]]
    print(Solution().findJudge(N, trust))

執行效率其實也和方法一差不多,在60%左右。

當然了,大家有什麼好的方法,還請積極留言啊!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章