【描述】
假设旋转数组在您实现不知道的某个轴上旋转,如[0, 1, 2, 3, 4, 5, 6, 7],旋转之后[4, 5, 6, 7, 0, 1, 2, 3];
您将获得一个搜索的目标值,如果在数组中找到,则返回其索引,否则返回-1;
您可以假设数组中不存在重复项;
【分析】
主要思想为:采取二分法进行查询;
1. 二分法进行查询指定目标值;
2. 查询有序一半数组值,判断目标值是否在有序数组值中;不在有序数组值中,那么就在剩余一半中进行查询;
3. 时间复杂度 O(log n),空间复杂度 O(1)
注意:具体实现参考代码;
【代码实现】
//demo.h
int search(int arr[], int len, int target);
//demo.c
int search(int arr[], int len, int target)
{
int start = 0;
int end = len;
if (len <= 0) {
return -1;
}
while (start != end) {
const int mid = (start + end) / 2;
if (arr[mid] == target) {
return mid;
}
if (arr[start] <= arr[mid]) {
if (arr[start] <= target && target < arr[mid]) {
end = mid;
}
else {
start = mid + 1;
}
}
else {
if (arr[mid] < target && target <= arr[end - 1]) {
start = mid + 1;
}
else {
end = mid;
}
}
}
return -1;
}