私は今数日間割り当て問題に取り組んできました。私は、このプログラムを線形時間で実行することは非常に難しいと感じています。私はそれをO(n^2)で動作させましたが、私は完璧な得点を得たいと思います。このプログラムを線形時間で実行するにはどうすればよいですか?
質問: 特定の数字の複製をネガティブに変更し、すべての複製を配列の最後に送信するように求められます。
For example, if the input array is [ 4 , 1 , 1 , 3 , 3 , 3 , 1 , 1 ], it
reads [ 4 , 1 , 3 , 1 , -1 , -1 , -1 , -1 ] after squeeze() completes.
そして、ここに私のプログラムは次のとおりです。
int base = ints[ints.length -1];
int count = 0;
for (int i = ints.length - 1 ; i > 0 ; i--)
{
if (base == ints[i-1])
{
ints[i] = N_ONE;
count++;
} else {
base = ints[i-1];
}
}
int count2 = 0;
for (int j = 0; (count) != count2 ; j++)
{
if (ints[j] == -1 && ints[j+1] != -1)
{
ints[j] = ints[j+1];
ints[j+1] = N_ONE;
count2 = 0;
j = 0;
} else if (ints[j] == -1 && ints[j+1] == -1){
count2++;
}
}
}
私の最初のループが効率的に機能し、それはとして-1のすべての重複番号を設定し、しかしだけでなく、私の第二のループは、リニア・ランタイムではありませんが、私それがより簡単な方法でできるように感じる。私は手でプロセスを書くことを試みたが、私はまだO(n^2)のメソッドしか考え出されていないようだ。
提案やヒントがありますか?本当にシンプルなものがありますか?
ありがとうございます!
あなたが読んでいる場所と書いている場所のそれぞれのインデックスを使って、1回のパスで行います。重複のブロックを読み取るために一度だけ書き込みます。読み込み要素を使い果たしたときは、配列の残りの部分を-1で埋めてください。 –
_O(n)_時間に重複を見つけるには、 'HashSet'を使用してください。 –
Andreas