免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
昇順にソート配列は、事前にあなたにいくつかのピボット不明で回転させるとします。
(すなわち、 [0,1,2,4,5,6,7]
なるかもしれません [4,5,6,7,0,1,2]
)。
あなたが検索した目標値を与えています。配列で見つかった場合は、そのインデックスを返し、そうでない場合は返します -1
。
あなたは重複が配列に存在しないと仮定して。
あなたのアルゴリズムの実行時の複雑さは、の順番でなければなりません O(ログ nで)。
例1:
入力: NUMS = [4,5,6,7,0,1,2]、目標= 0 出力: 4
例2:
入力: NUMS = [4,5,6,7,0,1,2]、ターゲット= 3 出力: -1
訪問:バイナリ検索は、我々は最初にすべての回転状況アレイNUMSの= [0,1,2,4,5,6,7]の、以下のよう
- 0,1、-1,2,4,5,6,7-
- 1,2,4,5、 6,7,0
- 2,4,5,6、 7,0,1
- 4,5,6,7、 0,1,2
- 5,6,7、0,1,2,4
- 6,7,0、1,2,4,5
- 7,0,1、2,4,5,6
それはどんなに回転、または秩序、あるいは後半と秩序の前半、見出すことができない。裁判官は、前半を注文したか後半はそれを注文しているので、どのように。
- NUMS [中期] <NUMS [右]半分整然とした後
- NUMS [左] <NUMS [中期]は、前半を命じました
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.size() < 1 || (nums.size() == 1 && nums[0] != target))
return -1;
int left = 0, right = nums.size()-1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < nums[right]) { //后半段有序
if (nums[mid] < target && nums[right] >= target)
left = mid + 1;
else
right = mid - 1;
}
else { // 前半段有序
if (nums[left] <= target && target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
}
return -1;
}
};
完成しました、