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.
思路:先查找分界点,再进行二分。
先推荐一篇很好的博文: http://blog.youkuaiyun.com/pickless/article/details/9191075
以下是我AC的代码:
public class Solution {
public int search(int[] A, int target) {
if(A == null|| A.length == 0)
return -1;
int start = 0;
int end = A.length - 1;
int index = 0;
int sign = 0;
int result = -1;
for(int i = 0; i < A.length - 1; i++){
// System.out.println("start:" + start+"end:"+end);
if(A[start] == target){
result = start;
}
else if(A[end] == target){
result = end;
}
else if(A[start] > A[start + 1]){
index = start;
sign = 2;
break;
}
else if(A[end] < A[end - 1]){
index = end;
sign = 1;
break;
}
else if(start == end || start + 1 == end)
{
//System.out.println("Here");
return -1;}
else{
start ++;
end --;
}
}
if(result > 0)
return result;
else if(sign == 2){
start = start + 1;
//end = index;
//System.out.println("Here");
return halfsearch(A, start, end, target);
}
else //if(sign == 1)
{
//start = index;
end = end - 1;
// System.out.println("Here");
// System.out.println(start);
// System.out.println(end);
return halfsearch(A, start, end, target);
}
}
public int halfsearch(int[] A, int s, int e, int target) {
if (A == null ) {
return -1;
}
else if(A[s] == target)
return s;
else if(s >= e)
return -1;
int start = s;
int end = e;
int mid;
// System.out.println(s);
// System.out.println(e);
/* [1, 2] */
while (start + 1 < end) {
mid = start + (end - start) / 2;
if (A[mid] == target) {
return mid;
} else if (A[mid] < target) {
start = mid;
} else {
end = mid;
}
}
if (A[start] == target) {
return start;
}
if (A[end] == target) {
return end;
}
return -1;
}
}