回転したソート配列で33件の検索
中
配列は、事前にあなたにいくつかのピボット不明で回転させ、昇順にソートしたとします。
(すなわち、 [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
参考:https://blog.csdn.net/qq_26410101/article/details/80665577
問題解決のアイデア:
時間が必要な複雑性O(ログn)があるため、それは二分法であるべきです。タイトルからは、注文され、その後、どのように配列の一部を決定するために、アレイは、途中で2つの部分に分かれている場合、アレイは、その後、少なくとも一部が発注され、注文され見ることができますか?すなわち、この中間の列の計算された数(右+左)場合/ 2、MIDが>右、左の列は数がどのように命じました。ミッド場合は<右、右の列の数が発注されています。その部分は、列の数を見つけるために注文された場合、あなたは(前提の二分法は、列の数を注文する必要があります)二分法を見つけるために使用することができます。もし注文番号数は内部に順序付けられたシーケンスかどうかは不明である場合、その部分の列数、バイナリサーチは、その後、オーダーのその部分を見つけるために、二つの部分にシリーズを続け、その後に戻った場合上記の手順。
あなたは上記の考え方を理解していない場合は、リンクが提供して参照することができ、理解するのを助けることができる例があります。
注:バイナリ検索を実行し、左と右の時間の値を変更すると、ままにしておく必要があり、ミッド+ 1またはミッド1 =右、右=半ば、ままにすることはできません、それ以外の場合は、無限ループに陥っされていたであろう。
class Solution {
public:
int search(vector<int>& nums, int target) {
int cnt = nums.capacity();
int left = 0, right = cnt-1;
int mid = cnt / 2;
while(left<=right) {
mid = (left + right) / 2;
if(nums[mid]==target) return mid;
if(nums[mid] > nums[right]) {
// left
if(target>=nums[left] && target <=nums[mid]) {
right = mid-1;
}
else {
left = mid+1;
}
}
else {
if(target>=nums[mid] && target <=nums[right]) {
left = mid+1;
}
else {
right = mid-1;
}
}
}
return -1;
}
};