int find(int* nums, int start, int end, int target) {
if (start>end) return -1;
int mid=0;
while(start <= end){
mid=(start+end)/2;
if (nums[mid] < target){
start=mid+1;
} else {
if (nums[mid] > target){
end=mid-1;
} else {
return mid;
}
}
}
return -1;
}
int search(int* nums, int numsSize, int target) {
int start=0, end=numsSize-1;
int index=0; //翻转的临界点
int num1=-1, num2=-1;
int flag=0;
while(index+1 < numsSize){
if(nums[index] >= nums[index+1]){
flag=1;
break;
}
index++;
}
if(flag==0) index=0;
printf("%d", index);
if(target <= nums[index] && target >= nums[0]){
return find(nums, 0, index, target);
} else {
return find(nums, index+1, numsSize-1, target);
}
}
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.
本题是二分查找的变形题,主要就是找到翻转的那个临界点(下一个数值比它小)就可以了,然后看target的大小判断应该在哪个范围内进行二分查找。