(昇順回転配列の最小数を見つけます。)
本方法:このトピックでは、アレイの特性を見て、その後、この機能に応じて記述することです。シーケンスの最初の要素よりも小さい第二段落に増分を表す場合インクリメント配列は配列を増加させる二つの部分に回転最初の要素よりも大きい場合、我々は、中間点を見つけ、彼は、最初の段落に増加するシーケンスで前記しました。これは、再帰または反復して行うことができます。もう一つ注意すべきは、中間要素と最初の要素が等しく、かつ、最後の要素が等しい場合、この要素が最初にまたはシーケンスにおける第二の増加に昇順であるか、今回我々は、この時間を見ることができないということです最小の要素を決定するためにスキャンを完了するために開始します。注意すべきもう一つのポイントは、アレイは、それが0の配列要素は、バックこの我々は入るべきではない、時間や再帰ループを動かす前に置かれ、回転させることがないかもしれないです。
public int find(int[] a){
int index1 = 0;
int index2 = a.length-1;
int mid = index1;
while(a[index1] >= a[index2]){
//index1始终在第一个序列,index2始终在第二个序列,当发生下面的情况时,找到最小值。
if(index1 == index2-1){
mid = index2;
break;
}
mid = index1 + (index2-index1)/2;
//如果发生了这种情况,不能通过迭代继续寻找下去了
if(a[mid] == a[index1] && a[mid] == a[index2]){
return searchMin(a, index1, index2);
}
if(a[mid] >= a[index1]){
index1 = mid;
}else if(a[mid] <= a[index2]){
index2 = mid;
}
}
return a[mid];
}
private int searchMin(int[] a, int start, int end){
int result = a[start];
for(int i=start+1; i<=end; i++){
if(a[i] < result){
result = a[i];
}
}
return result;
}