私は今、コディリティのトレーニングをしています。自分で解決できるタスクもありますが、一部のタスクには問題があります。このタスクの難易度は<**>です。ミディアムですが、失速しました。
問題:
N 個の整数で構成される、空でないゼロ インデックスの配列 A が与えられます。0 ≤ i < N のような各数値 A[i] について、A[i] の約数ではない配列要素の数をカウントします。これらの要素は非除数であると言います。たとえば、次のような整数 N = 5 と配列 A を考えてみましょう。
A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 6
次の要素の場合:
A[0] = 3, the non-divisors are: 2, 6,
A[1] = 1, the non-divisors are: 3, 2, 3, 6,
A[2] = 2, the non-divisors are: 3, 3, 6,
A[3] = 3, the non-divisors are: 2, 6,
A[6] = 6, there aren't any non-divisors.
関数を書く:
class Solution { public int[] solution(int[] A); }
これは、N 個の整数で構成される空でないゼロ インデックスの配列 A を指定すると、非除数の数を表す整数のシーケンスを返します。シーケンスは次のように返されます。
- 構造体 結果 (C)、
- または整数のベクトル (C++ の場合)、
- またはレコード結果(パスカル)、
- または整数の配列 (他のプログラミング言語)。
たとえば、次のようになります。
A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 6
上記で説明したように、関数は [2, 4, 3, 2, 0] を返す必要があります。と仮定する:
- N は [1..50,000] の範囲内の整数です。
- 配列 A の各要素は [1..2 * N] の範囲内の整数です。
複雑:
- 予想される最悪の場合の時間の複雑さは O(N*log(N)) です。
- 予想される最悪の場合のスペースの複雑さは O(N) であり、入力ストレージを超えています (入力引数に必要なストレージは数えません)。
入力配列の要素は変更できます。
私はいくつかの解決策を書きました。しかし、私のソリューションはかさばり、まだ O(n^2) の複雑さがあります。それを最適に行うためのアイデアやアルゴリズムを教えてもらえますか? 面接の仕事でも何でもない。私はただトレーニングをしていて、すべてのタスクを解決しようとしています。このタスクは次の場所にあります: http://codility.com/demo/train/レッスン 9、レッスンの最初のタスク。
ありがとうございました!