例如int arr[] = {4,5,6,7,0,1,2,3} ;int arr[] = {5,6,0,1,2,3,4]称为旋转数组 在该数组中实现二分查找
思路:每次找mid位置 必有一边是严格单增的 再通过目标值与arr[end]的大小来改变每次搜索的begin和end的值
/*
旋转数组的二分搜索
int arr[] = {4,5,6,7,0,1,2,3}实现二分搜索
*/
int rotateArrayBinarySearch(int* arr, int len, int target) {
if (arr && len) {
int begin = 0;
int end = len - 1;
int res = -1;
while (begin <= end) {
int mid = (begin + end) / 2;
if (arr[mid] == target) {
res = mid;
break;
}
else {
//左边严格递增
if (arr[mid] > arr[begin]) {
//此时左右2边都有可能 通过与target和arr[end]做比较
if (arr[mid] > target) {
//只能在左边 end变动
if (target > arr[end]) {
end = mid - 1;
}
//只能在右边 begin变动
else {
begin = mid + 1;
}
}
else {
begin = mid + 1;
}
}
//右边严格递增
else {
if (arr[mid] < target) {
//只能在左边 end变动
if (arr[end] < target) {
end = mid - 1;
}
//只能在右边 begin变动
else {
begin = mid + 1;
}
}
else {
end = mid - 1;
}
}
}
}
return res;
}
return -1;
}