バイナリ検索LeetCode33回転配列をソート

回転したソート配列で検索

説明

6,7,8,1,2,3,4 [> -そのような[1,2,3,4,5,6,7,8]のように、一つに記載のソートされた配列を想定し、次に回転ピボット5]。
あなたの仕事はにある回転など1から6のように下付き添字の数字の後に配列を、見つけ、そしてこの数は、存在しない場合は-1が返されます。
要件:Oの時間複雑度(ログ(N))

ソリューション

  • もちろん、私たちはLOGN分割統治(分割統治)を見ることを期待すべきです。D&Cを使用する方法の3つの方法があります。
      1. この問題の最も簡単な方法は、分割統治を介して第1のピボットは、上記見つけ、「スピン」のGoバックは、この番号を持って行くのです。
      1. 「スピン」の特徴によれば、どこかのステップが発生したでしょう配列に加えて、他は増加しています。ミッド片側が常にあり、どんなに(左>半ば、半ば>右 ) 単調に増加しています。だから我々は常に可能という漸進半ばとターゲットエッジの位置との関係を決定します。
      1. 2さらにまとめたもので、改良された方法では、nums[0]<=target, target<=nums[i], nums[i]<nums[0]3つの条件がすべての状況が含まれ、その後、XORは、簡潔な方法を書いた:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/をソリューション/ JI-建溶液-バイ・lukelee /

境界条件

  • もちろん、上記のアイデアを考えることは困難ではない、我々は、少なくとも第2のステップを行うことができますが、境界条件はまだ考える必要があり思いました。
  • 一般に二つのケースに分け境界バイナリサーチアルゴリズムは、一つは、一つ]右、左〔と同様、近い右近距離を放置する)、左、右と同様閉右開区間を、残っている。これは注目すべきですそれは、体が、ルール一貫した間隔を遵守しなければならない、インビトロ初期条件においてループ反復ステップ環状です。
  • プログラミングの真珠への最善の方法は、与えられました:
int search4(int array[], int n, int v)
{
int left, right, middle;

left = -1, right = n;

while (left + 1 != right)
{
    middle = left + (right - left) / 2;

    if (array[middle] < v)
    {
        left = middle;
    }
    else
    {
        right = middle;
    }
}

if (right >= n || array[right] != v)
{
    right = -1;
}

return right;
}

参考:https://blog.csdn.net/weixin_43705457/article/details/87874779

おすすめ

転載: www.cnblogs.com/SsoZhNO-1/p/12498466.html