私はこの問題に対する O(n 2 ) の解決策を持っており、より良い解決策があるかどうか疑問に思っています。合計が c である 2 つの数値を見つけようとしている場合、O(nlogn) の解があることがわかります。(ここで与えられます) ここで同様のアプローチを試します: 最初に O(nlogn) 時間でマージソートを使用して配列をソートし、次に配列の両端から開始して、それらの違いを調べます。これが c に等しい場合、完了です。差が c よりも大きい場合、右端のインデックスを 1 減らしますが、これは間違っていると思います。右端のインデックスを減らす必要があるのか、それとも左端のインデックスを増やす必要があるのかわかりません。私は正しいですか?この問題をより良い時間計算量で解けるでしょうか? ありがとう
3 に答える
4
重要なのは、配列がソートされると、二分探索はO(logn)
.
配列内の各数値について、 が配列内にあるかどうかを二分探索でx
テストします。x-c
これはまだO(nlogn)
です。
派手にしたい場合は、配列を 2 回反復するだけでそれを行うことができますが、いずれにせよ、複雑さは並べ替えステップによって支配されます。
于 2013-03-10T14:44:43.233 に答える
1
私のアプローチ、ハッシュとを使用してno need for pre-sorting
、それはハッシュの実装に依存します。最良の場合はO(n)で実行でき、最悪の場合はO(nlogn)で実行できます。
arr[] = { ... }
hash[] // maps Integer to Boolean
for e in arr:
hash[e] = true
if hash[e+c] == true Or hash[e-c] == true:
return true
return false
各要素に対して、配列を反復処理しe
ます。
e
ハッシュでtrueにマップ- 現在の要素との違いがある要素がある場合
c
、ビンゴ:D
お役に立てれば :)
于 2013-03-10T15:17:19.297 に答える
0
O(n log n) 時間かかる配列をソートできます。次に、最初の各メンバー x を c - x に置き換えてから逆にすることで、2 番目の配列を作成できます。次に、2 つの配列に、それぞれ O(n) に対して 2 つの走査を行う共通の要素があるかどうかを確認できます。
于 2013-03-19T18:43:15.947 に答える