搜索旋转数组和搜索排序数组唯一的区别在于需要寻找旋转的位置。
e.g. { 4,5,6,7,8,1,2,3 }
取其中间位置[(0+7)/2]是第三’7’,'7’比4大证明‘7’前边的数组是有序的,若target在4-7之间,即可用二分查找得出答案。
若不在该区间则以同样方法搜索{ 8,1,2,3 }这个数组。直到数组元素≤2,target若与剩余2个数都不相同则返回-1。
时间复杂度:O(logN)
C++代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int st = 0, en = nums.size() - 1;
while (st <= en)
{
int mid = (st + en) >> 1;
if (nums[st] == target)
return st;
if (nums[mid] == target)
return mid;
if (nums[en] == target)
return en;
if (nums[st] < nums[mid])
{
if (target > nums[st] && target < nums[mid])
en = mid - 1;
else
st = mid + 1;
}
else
{
if (target > nums[mid] && target < nums[en])
st = mid + 1;
else
en = mid - 1;
}
}
return -1;
}
};