安全プランを証明する[6] - アレイの回転の最小数

タイトル説明

いくつかの要素の配列の先頭には、配列、我々は回転呼んで配列の最後に移動しました。出力回転最小の素子アレイの回転の入力配列の非降順。例えば、配列{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];
}

おすすめ

転載: www.cnblogs.com/Jacob98/p/12430400.html