これは、喜びと喜びの最初の本である373、最初の更新400ピアンオリジナル
01の質問と準備ができて見えます
今日導入さLeetCode
における演算問題Easy
最初のレベル234
(全体のタイトル番号がタイトル997
)。町では、あるN
1からの人N
のマークが。そのうちの一つは、町の裁判官の秘密であるという噂があります。
町の裁判官は、その後、存在する場合:
タウン裁判官は誰を信用していません。
(裁判官の町を除く)誰もが信頼町の裁判官を持っています。
一人だけは、最初の2つを満たしています。
与えられたtrust
配列のペアtrust[i] = [a,b]
として表現がマークされているa
人々の信頼がマークさb
男を。
町の場合は、タグの町の裁判官が返され、そこに裁判官であると識別することができます。それ以外の場合は-1を返します。
例えば:
入力:N = 2、信頼= [ [1,2]]
出力:2
入力:N = 3、信頼= [ [1,3]、[2,3]
出力:3
入力:N = 3、信頼= [ [1,3]、[2,3]、[3,1]
出力:-1
入力:N = 3、信頼= [ [1,2]、[2,3]
出力:-1
入力:N = 4、信頼= [ [1,3]、[1,4]、[2,3]、[2,4]、[4,3]
出力:3
注意:
1 <= N <= 1000
trust.length <= 10000
信頼[i]は異なっています。
信頼[I] [0]!=信頼[i]が[1]
1 <=信頼[I] [0]、信頼[I] [1] <= N
02第一溶液
タイトルが何であるかを翻訳し、裁判官は等しい自信番号ありN-1
、そして裁判官は、裁判官であることを、他の人を信頼することはできませんtrust
配列のtrust[i][1]
出現等しい数N-1
人(信託周波数がに等しいN-1
)、及びtrust[i][0]
(裁判官が他の人を信頼することはできませんタグ裁判官と等しくありません)。
アイデア:使用しHashMap
、信頼できるかを調べるために信頼「レコードの出現回数をN-1
人々の意見を、その後に行ったtrust
人が他の人に信頼を持っているかどうかを判断するために配列。一種の特殊なケースがありN
、1の時のためにtrust
、一人だけで空の配列が、その人は裁判官です。
public int findJudge(int N, int[][] trust) {
// 只有1个人的时候,法官就是他本人
if (N == 1) {
return N;
}
// key为被信任的人,value为其被信任的次数
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int[] arr : trust) {
map.put(arr[1], map.getOrDefault(arr[1], 0)+1);
}
// 找到被信任次数等于N-1的那个人
int count = -1;
for (Integer key : map.keySet()) {
if (map.get(key) == N-1) {
count = key;
}
}
// 被信任次数等于N-1的人,不能信任其他人
for (int[] arr : trust) {
if (arr[0] == count) {
return -1;
}
}
return count;
}
03第二の溶液
最初のソリューションのためにHashMap
、我々はまた、使用することができint
、最初のソリューション上記のアレイを交換するという考えと一致しています。
public int findJudge2(int N, int[][] trust) {
if (N == 1) {
return N;
}
int[] trusted = new int[N+1];
for (int i=0; i<trust.length; i++) {
trusted[trust[i][1]]++;
}
int count = -1;
for (int i=0; i<trusted.length; i++) {
if (trusted[i] == N-1) {
count = i;
}
}
for (int[] arr : trust) {
if (arr[0] == count) {
return -1;
}
}
return count;
}
04第三の溶液
第二の溶液のために、我々は二つに簡略化することができfor
サイクル、統計の数が最も信頼し、一緒に処理する人の数を見つけるために、信頼されます。
public int findJudge3(int N, int[][] trust) {
if (N == 1) {
return N;
}
int[] trusted = new int[N+1];
int count = -1, num = -1;
for (int i=0; i<trust.length; i++) {
trusted[trust[i][1]]++;
if (trusted[trust[i][1]] > count) {
count = trusted[trust[i][1]];
num = trust[i][1];
}
}
// 被信任次数要等于N-1
if (count != N-1) {
return -1;
}
for (int[] arr : trust) {
if (arr[0] == num) {
return -1;
}
}
return num;
}
05第溶液
我々はまた、配列は、ARRの人々の信頼を維持し、別の配列、2つのint配列を解決するために使用することができarr2
、信頼に堆積は、信頼に等しい回数見つけることですN-1
(を)arr2[i]=N-1
と臨時全く信頼(ありませんarr[i]=0
)男性が、彼は裁判官です。
public int findJudge4(int N, int[][] trust) {
int[] arr = new int[N+1];
int[] arr2 = new int[N+1];
for (int i=0; i<trust.length; i++) {
arr[trust[i][0]]++;
arr2[trust[i][1]]++;
}
for (int j=1; j<arr.length; j++) {
if (arr[j] == 0 && arr2[j] == N-1) {
return j;
}
}
return -1;
}
06まとめ
テーマ別のアルゴリズムは、継続的にされている日以上7ヶ月、特集記事のアルゴリズム240件の +記事、公衆番号]ダイアログボックスの返信[ データ構造とアルゴリズム ]、[ アルゴリズム ]、[ データ構造 ]のいずれかの記事のコレクションのシリーズを取得するキーワード。
それは、すべてだあなたは何か良い解決策のアイデア、提案やその他の問題がある場合、あなたは以下のコメントを交換することができ、親指、メッセージ転送およびサポートは、私にとっての最大の報酬です!