1.問題の説明
町 には、から まで の番号が付けられn
た個人がい ます。噂によると、これらの男性の1人は密かに小さな町の裁判官です。1
n
町の裁判官が実際に存在する場合、次のようになります。
- 町の裁判官は誰も信用していません。
- 誰もが(町の裁判官を除いて)町の裁判官を信頼しました。
- プロパティ1 とプロパティ 2の両方を満たすのは1人だけ です。
個人IDが個人IDを信頼 trust
して trust[i] = [ai, bi]
いることを 示す配列が与えられます 。ai
bi
町の裁判官が存在し、識別できる場合は、その裁判官の番号を返します。それ以外の場合は、を返し -1
ます。
例1:
入力: n = 2、信頼= [[1,2]] 出力: 2
例2:
入力: n = 3、信頼= [[1,3]、[2,3]] 出力: 3
例3:
入力: n = 3、信頼= [[1,3]、[2,3]、[3,1]] 出力: -1
ヒント:
1 <= n <= 1000
0 <= trust.length <= 10^4
trust[i].length == 2
trust
すべてがtrust[i] = [ai, bi]
互いに異なりますai != bi
1 <= ai, bi <= n
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/find-the-town-judge
著作権はLeetCode.comに帰属します。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2.問題解決分析
ジャッジが1人の場合は、次の条件を満たす必要があります。
(1)他のすべての人は裁判官を信頼しているので、それぞれが少なくとも1回は信頼の最初の要素に現れます[i]
(2)信頼度がn-1の人は1人だけで、この人が裁判官であり、信頼の最初の要素の位置には表示されません[i]。
ハッシュテーブルtrust_degree(python dict)は個人の信頼度を管理するために使用され、別のハッシュテーブルnon_judge(python set)は非裁判官のリストを管理するために使用されます。
信頼をトラバースします。信頼ごとに[i]=[ai、bi]:
- non_judgeにaiを追加し、trust_degreeにある場合はaiを削除します
- biがnon_judgeにない場合:
- biがtrust_degreeにある場合は、その値を1ずつ増やします。
- biがtrust_degreeにない場合は、それを追加して値を1として記録します。
町には一人しかいないというのが無視しやすい状況ですが、現時点では、質問の条件により、aiとbiが等しくてはいけないので、信頼は空でなければなりません。事件は裁判官です。
3.コードの実装
import time
from typing import List
from collections import deque
class Solution:
def findJudge(self, n: int, trust: List[List[int]]) -> int:
trust_deg = dict()
non_judge = set()
for [ai,bi] in trust:
non_judge.add(ai)
if ai in trust_deg:
trust_deg.pop(ai)
if bi not in non_judge:
if bi in trust_deg:
trust_deg[bi] = trust_deg[bi] + 1
else:
trust_deg[bi] = 1
if len(trust_deg)==1:
a = trust_deg.popitem()
if a[1] == n - 1:
return a[0]
return -1
if __name__ == "__main__":
sln = Solution()
n = 2
trust = [[1,2]]
print(sln.findJudge(n, trust))
n = 3
trust = [[1,3],[2,3]]
print(sln.findJudge(n, trust))
n = 3
trust = [[1,3],[2,3],[3,1]]
print(sln.findJudge(n, trust))
実行時間:76ミリ秒、すべてのPython3コミットでユーザーの97.45%を上回った
メモリ消費量:18.2 MB、すべてのPython3コミットでユーザーの46.34%を上回っています
メインディレクトリに戻る:Leetcodeの毎日の問題解決ディレクトリ(動的更新...)