web-dev-qa-db-ja.com

隣接ペアの計算

次の問題が発生しました:

Integer V lies strictly between integers U and W if U < V < W or if U > V > W.
A non-empty zero-indexed array A consisting of N integers is given. 
A pair of indices (P, Q), where 0 ≤ P < Q < N, is said to have adjacent values if no value 
in the array lies strictly between values A[P] and A[Q].
For example, in array A such that:
A[0] = 0 A[1] = 3 A[2] = 3
A[3] = 7 A[4] = 5 A[5] = 3
A[6] = 11 A[7] = 1
the following pairs of indices have adjacent values:
(0, 7), (1, 2), (1, 4),
(1, 5), (1, 7), (2, 4),
(2, 5), (2, 7), (3, 4),
(3, 6), (4, 5), (5, 7).
For example, indices 4 and 5 have adjacent values because there is no value in array A that lies 
strictly between A[4] = 5 and A[5] = 3; the only such value could be the number 4, 
and it is not present in the array.
Write a function that returns number of adjacent values

私の解決策は次のとおりです:

  • 各ペアについて、この範囲内にある他の要素があるかどうかを確認します
  • そうでない場合は、隣接ペアの数を増やします
  • そうでなければ、別のペアに進みます。

このアプローチはO(N ^ 3)を取ります。これを解決するより良い方法があるかどうか知りたいですか?

3

あなたが持っている入力配列は:

0, 3, 3, 7, 5, 3, 11, 1

代わりに、配列は次のようになると想像してください。

0, 1, 3, 3, 3, 5, 7, 11

配列がそのように構成されている場合は、配列をループして、ペアをより簡単にカウントできます。

0 --> 1
1 --> 3, 3, 3
3 --> 3, 3, 5
3 --> 3, 5
3 --> 5
5 --> 7
7 --> 11

それは1 + 3 + 3 + 2 + 1 + 1 + 1 = 12ペアです。以前に見つけたのと同じ番号。一致?私はそうは思いません。

配列をこのように並べ替える方法があったら…ああ、 わかっています!

時間の複雑さ? O(n)は、並べ替えられた配列のループとカウントのペアの場合、O(n log n)は配列の並べ替えの場合。したがって、O(n log n + n)= O(n log n)

3
Simon Forsberg