最も効率的な実行時間で指定された値に等しい、並べ替えられた配列内の連続する要素の算術平均があるかどうかを確認するにはどうすればよいですか?

ダム

入力:

  • 正の自然数の並べ替えられた配列、

予想される複雑さ:

  • 時間: O(n)
  • 追加スペース: O(1)

例:

入力:

arr = {2,3,17,30} x=10

予想される行動:

この関数はインデックスを出力します:1,2(3 + 17)/ 2 = x = 10なので、trueを返します

入力:

x = 30

予想される行動:

(30)/1= x = 30`なので、関数はインデックス3を出力し、trueを返します。

アルゴリズムへの私のアプローチ:

配列の最初の要素から始まる算術平均を取ります。xが結果よりも大きい場合は、配列内の次の要素を算術平均に追加します。それ以外の場合は、最初の要素を算術平均から減算します。

試してみましたが、うまくいきませんでした。誰か助けてもらえますか?

xenteros
  1. a0 + a1 + a2 + ... + ak <= k * targetの合計である最大のkを見つけます
  2. 合計== k * targetの場合-ok
  3. sum!= k * targetの場合-次の要素を追加し、平均がターゲット以下になるまで最初の要素を減算します。

kが配列の長さに達した場合、解決策はありません。そうでなければ、あなたは解決策を持っています。ステップ3のように複雑さO(n)は、前の合計+ ak +1がk * targetよりも大きかったため、1つの数値のみを追加し、左の境界線はn回しか移動できません。

1. proc(array, x):
2.     sum = 0;
3.     left = 0;
4.     right = 0;
5.     do:
6.         sum += array[right];
7.         right++;
8.     while (sum+array[right] <= (right+1)*target && right<array.size);
9.     if (sum == right*target):
10.        for (i = left; i < right; i++):
11.            print(array[i] + <sep>);
12.        end_for
13.        return;
14.    end_if
15.    while (left <= right):
16.        if (right<array.size): sum += array[right++];
17.        do:
18.            sum-=array[left++]
19.        while (sum > target*(right-left));
20.        if (sum == target*(right-left)):
21.            for (i = left; i < right; i++):
22.                print(array[i] + <sep>);
23.            end_for
24.            return;
25.        end_if
26.    end_while
27.end_proc

すべての数値が正の配列に対して適切に機能します。ネガには小さな変更が必要ですが、インタビューでは、すべての数値がポジティブの配列についてよく尋ねられます。適切な解決策がない場合は、いくつかの追加のエスケープ条件が必要になる場合があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ