上次更新這個專欄還要追究到去年了
人太懶了,就一直把題目晾在一邊了
今年趕上了疫情,所以一直賦閒在家
想着幹些事情,就重新拾起了筆,繼續來更文章了
在家的每一天儘可能會更新文章
艾瑞巴蒂,我來了哈哈哈哈哈哈哈哈
最後,武漢加油,學校加油!
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%左右。
當然了,大家有什麼好的方法,還請積極留言啊!!!