回転したソート配列で検索
説明
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のピボットは、上記見つけ、「スピン」のGoバックは、この番号を持って行くのです。
-
- 「スピン」の特徴によれば、どこかのステップが発生したでしょう配列に加えて、他は増加しています。ミッド片側が常にあり、どんなに(左>半ば、半ば>右 ) 単調に増加しています。だから我々は常に可能という漸進半ばとターゲットエッジの位置との関係を決定します。
-
- 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さらにまとめたもので、改良された方法では、
-
境界条件
- もちろん、上記のアイデアを考えることは困難ではない、我々は、少なくとも第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