配列をソートするsubArrayLeftShift方法に最小限の呼び出し(面接の質問)

マーク:

もし方法があるとsubArrayLeftShift(a,i)[iが...、N-1]のシフトは、サブ配列Aを去ったとき、N配列の長さです。要素は...、[N-1]は[I + 1]、左側の1つの場所を移動し、元のAれていることをことを意味する[I]は、最後のものになるであろう。

より正式に、ここでの機能の実装は次のとおりです。

public static void subArrayLeftShift(int[] a, int i){
  if (a.length == 0) return;

  int last = a.length - 1;
  int insertToLast = a[i];
  for (; i < last; i++){
      a[i] = a[i + 1];
  }
  a[last] = insertToLast;
}

今の質問には:未ソート配列を受け取る機能を実装し、へのコールの最小数を返すsubArrayLeftShift配列をソートします。

インタビューの中で、私はそれを行うための方法を見つけるcouldntの。私は直感のために書いたすべての例のコールの最小数を見つけるために成功したが、それを一般化のための方法を見つけることができませんでした。

あなたはそれを解決する方法を知っていますか?

Niver:

私はこの問題を解決するには、以下のアルゴリズムを提案します。

  • (配列の右側の数が少ない)ソートされていない配列の最小数を検索します。この数は、とするX
  • 配列内の数字は、以前にされた数のより大きいどのように多くの回数のxこの数はとするyと

関数への各呼び出しのために、ソートされていない番号が最後の位置で終わるので、最適な戦略は、昇順にソートされていない各番号の関数を呼び出すことです。以前に我々が開始見つかったものを使用して、Xこのように、それはの右側になってしまいますので、私たちは、xよりも大きな次のソートされていない番号を続けXので、それがソートされます。同じように続けます。いくら?よりどのくらい大きな数のx、我々が持っていますか?だまあ、Yそう合計として、関数の呼び出しの数は1つの+ Y

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202065&siteId=1