题目:
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.
假设一个有序数组在某点被翻转了,现在给你一个目标值去查找,如果找到,返回它的下标,否则返回-1.。假设没有重复的数。
思路:
先参看查找有序数组中的最小值:http://blog.csdn.net/u012243115/article/details/41923667。
本题依然使用二分法,难点在于如何判断 target 在前半段还是后半段。对于无重复的数组4 5 6 7 0 1 2,如果满足 A[begin] <= A[mid] ,即数组的第一个值小于中间值 4 < 7 ,那么可以断定前半段数组有序。如果不满足这个条件,(比如:4 5 0 1 2) 则说明后半段有序。因为把这个数组从中间分开后,一定至少有半个数组是有序的。然后再判断 target 是否在有序的半段中(这个很好判断),如果在,则相当于在有序数组中查找,很简单。如果不在有序的那半段,则一定在另外半段里。然后使用迭代即可把target找出。
public class Solution {
public int search(int A[], int n, int target)
{
int begin = 0;
int end = n-1;
while(begin <= end)
{
int mid = (begin + end)/2;
//判断mid是否为target,如果是,直接返回,如果不是,再判断target是在前半段还是后半段
if(A[mid] == target)
{
return mid;
}
//如果前半段有序
if(A[begin] <= A[mid])
{
//判断target是否在前半段,如果在,则继续遍历前半段,如果不在,则继续遍历后半段
if(A[begin] <= target && target < A[mid])
end = mid - 1;
else
begin = mid + 1;
}
//else说明后半段有序
else
{
//判断target是否在后半段,如果在,则继续遍历后半段,如果不在后半段,则继续遍历前半段
if(A[mid] < target && target <= A[end])
begin = mid + 1;
else
end = mid - 1;
}
}
return -1;
}
}
转自:https://blog.csdn.net/u012243115/article/details/42002283