问题:已知一个排过序的数组被旋转了几位(但不知道具体旋转了几位),例如,{0,1,2,3,4,5,6,7}变成了{3,4,5,6,7,0,1,2},。现要求你查找某一个元素,如果找到了,就返回下标,如果没找到,返回-1。假设不存在重复元素。
解答:我们可以用二叉搜索。每次都把数组分成两半,判别哪一半是排过序的。如果待查元素在排过序的那一半,那么用二叉搜索。如果在另一半,那么我们递归地在这一半里继续查找。
class Solution {
public:
int search(int A[], int n, int target) {
int low = 0;
int high = n - 1;
while(low <= high) {
int mid = low + (high - low) / 2;
if(A[mid] == target)
return mid;
if(A[low] <= A[mid]) { // left part sorted
if(A[low] <= target && target < A[mid])
high = mid - 1;
else
low = mid + 1;
} else {
if(A[mid] < target && target <= A[high])
low = mid + 1;
else
high = mid - 1;
}
}
return -1;
}
};