マーク:
もし方法があると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。