题目:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
思路:二分查找变型;并且假设数组中没有数字重复。
由于只是旋转了一次,总有一边是正常排序的(从左到右),可以作为参考依据,不符合条件则在另外一边搜索。
复杂度:O(log(N))
Attention:
1. 注意判断分类时,A[START] == A[MID]属于第一类情况,说明start和mid重合了,应该从左开始搜索。
2. 计算mid
使用(low+high)/2会有整数溢出的问题
(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题
若属于第二类,ERROR CODE:
Input: | [3,1], 1 |
Output: | -1 |
Expected: | 1 |
AC Code:
class Solution {
public:
int search(int A[], int n, int target) {
//二分查找变型
//假设没有数组中没有重复的数字
int start = 0;
int end = n - 1;
//由于只是旋转了一次,总有一边是正常排序的,可以作为参考依据,不符合条件则在另外一边搜索。
while(start <= end)
{
int mid = (start + end) / 2;
if(A[mid] == target) return mid;
if(A[start] <= A[mid])
{
if(A[start] <= target && target <= A[mid])
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
else
{
if(A[mid] <= target && target <= A[end])
{
start = mid + 1;
}
else
{
end = mid - 1;
}
}
}
return -1;
}
};