タイトル説明
いくつかの要素の配列の先頭には、配列、我々は回転呼んで配列の最後に移動しました。出力回転最小の素子アレイの回転の入力配列の非降順。例えば、配列{3,4,5,1,2}、{1,2,3,4,5}は最小のアレイの回転です。
注:配列のサイズは、リターン0 0である場合、すべての要素は、0よりも大きいに記載されています。
バイナリサーチ変種
まず言ったのタイトル説明の非降順の配列 -非減少手段が何を意味するか、増分、不連続な増加があるかもしれないことを、法律の増加または減少は、同じサイズの残っていないが、1つの条件がタイトルがあるソートを配列は、配列は、我々は除外し、ソートする必要があり、不規則に増減を可能性、可能性は(変わらないが、直線、ここに描かれていない)は、次の3つに分割されています。
2例は、一般的にありますが、バイナリ思考は常に、ストライプアレイを探して検索範囲を縮小し、最終的に見つけるために、要素をロックしています。我々は今、あまりにも、二つのパラメータがあることheigh=length-1
、およびlow=0
可変設定次いで、mid
中間値は、中間値が決定されるarr[high]
とarr[low]
サイズコントラスト、場合arr[high]
の比arr[mid]
ように大きなは、high
等しいmid
場合、arr[low]
比がarr[mid]
小さいので、そのことはlow
同じですmid+1
。
次のようにしかし、そのような特別な場合があります
だから、実際にあなたがおそらく最終的に生産するためにしているarr[low]=arr[mid]=arr[high]
ので、最終的には、変数の値を変更するべきかを決定することができない、このことを、ここで我々が使用low++
解決するための方法を、これまで知っているように見え等しくありません。
function minNumberInRotateArray(rotateArray)
{
if(rotateArray.length==0){return 0;}
let hight = rotateArray.length - 1;
let low = 0;
while(hight>low){
let mid = Math.floor((hight+low)/2);
if (rotateArray[low] < rotateArray[hight]){return rotateArray[low];}
if(rotateArray[hight] > rotateArray[mid]){hight=mid;}
else if(rotateArray[low] < rotateArray[mid]){low=mid+1;}
else {low++;}
}
return rotateArray[low];
}
数学のメソッド呼び出し
この方法では、我々は次のようになり、非常に簡単です。
function minNumberInRotateArray(rotateArray)
{
if(rotateArray.length==0){return 0;}
return Math.min(...rotateArray);
}
粗探し
这种算法的思想就是从头到尾遍历数组,直到数组中出现了断层,也就是说数组的后一位小于前一位,那么这一位就是数组的最小值,如果到最后也没有符合条件的数,那么该数组就是一个大小不变的数组,返回数组的第一位即为最小值。
function minNumberInRotateArray(rotateArray)
{
if(rotateArray.length==0){return 0;}
for(let index=1; index<rotateArray.length; index++){
if(rotateArray[index]<rotateArray[index-1]){
return rotateArray[index];
}
}
return rotateArray[0];
}