搜索旋转数组和搜索排序数组唯一的区别在于需要寻找旋转的位置。
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 binary_search(vector<int> &nums,vector<int>::iterator st, vector<int>::iterator en, int target)
{
while (1)
{
if (st + 1 == en)
if (*en == target)
return en - nums.begin();
else if (*st == target)
return st - nums.begin();
else
{
return -1;
}
auto mid = st + ((en - st) >> 1);
if (*mid == target)
return mid - nums.begin();
else if (*mid > target)
en = mid;
else
st = mid;
}
}
int search(vector<int>& nums, int target) {
if (nums.size() <= 2)
{
for (int i = 0; i < nums.size(); i++)
if (nums[i] == target)
return i;
return -1;
}
auto start_it = nums.begin(), end_it = nums.end() - 1;
while (1)
{
if (start_it == end_it - 1)
{
if (target != *start_it && target != *end_it)
return -1;
}
auto mid_it = start_it + (end_it - start_it) / 2;
if (*start_it == target)
return start_it - nums.begin();
if (*mid_it == target)
{
return mid_it - nums.begin();
}
if (*end_it == target)
return end_it - nums.begin();
if (*mid_it < *end_it) //后半段有序
{
if (target > *mid_it && target < *end_it)
{
return binary_search(nums, mid_it, end_it, target);
}
else
end_it = mid_it;
}
else if (*mid_it > *start_it) //前半段有序
{
if (target > *start_it && target < *mid_it)
{
return binary_search(nums, start_it, mid_it, target);
}
else
start_it = mid_it;
}
}
}
};