私はCodeFightsから以下の問題を解決しようとしています。私は質問の後にJavaで私の答えを残しました。このコードは、最後のものを除くすべての問題に適用されます。時間制限の例外が報告されます。 3000ms(CodeFightの要件)を下回るようにするために私は何ができますか?CodeFights - FirstDuplicateメソッドの書き込み時の制限時間の問題
注:実際のインタビュー中に実行するように求められているので、O(n)時間の複雑さとO(1)の追加の複雑さのソリューションを作成します。
1からa.lengthの範囲の数字だけを含む配列aが与えられた場合、2番目のオカレンスが最小インデックスを持つ最初の重複番号を見つけます。つまり、重複した数字が2つ以上ある場合は、2番目のオカレンスが2番目のオカレンスよりも小さいインデックス番号を返します。そのような要素がない場合は、-1を返します。
例
= [2、3、3、1、5、2]、出力があるべき firstDuplicate(A)= 3
2つの重複があります番号2及び3の2回目の出現は、2回目の2回目の出現よりも小さい指標であるため、答えは3です。
a = [2,4,3,5,1]の場合、出力は firstDuplicate (a)= -1となる。
入力/出力
[期限] 3000ms
保証制約array.integer(ジャワ) [入力]: 1≤a.length、105≤1≤ [I] ≤a.length。
[出力]複数回アレイで発生し、その第二の発生の最小インデックスを持つ整数
素子。そのような要素がない場合は、-1を返します。
int storedLeastValue = -1;
int indexDistances = Integer.MAX_VALUE;
int indexPosition = Integer.MAX_VALUE;
for (int i = 0; i < a.length; i++)
{
int tempValue = a[i];
for (int j = i+1; j < a.length; j++) {
if(tempValue == a[j])
{
if(Math.abs(i-j) < indexDistances &&
j < indexPosition)
{
storedLeastValue = tempValue;
indexDistances = Math.abs(i-j);
indexPosition = j;
break;
}
}
}
}
return storedLeastValue;
こんにちは@localghost、私はあなたのソリューションが好きでしたが、私はコード100%を理解するための詳細が欲しいです。たとえば、cntarray [a [i]] == 0はどのように動作しますか?コードはcntarrayを初期化しません。その値はどのようにゼロ(または他の何か)と等しくなりますか?どうもありがとう! – Jas
'int'のデフォルト値はゼロです。 'int'の配列を宣言すると、すべての要素はゼロに初期化されます。ここをクリックしてください:https://stackoverflow.com/questions/2154251/any-shortcut-to-initialize-all-array-elements-to-zero – localghost
@Jas:私は「O(1)additional spaceあなたの質問の "複雑さ"です。 'cntarray = new int [106]'(第1不変式)がこの要件を満たしているかどうかは分かりません。より適切な回答が表示された場合は、この回答を受け入れることができます。 @alfasin:これにコメントしていただけますか? – localghost