思路1
compare A[mid] and A[r] --> 判断在rotate array的左半段还是右半段(有序片段)
什么时候右移?
A[mid]<A[r]:右半段有序;A[mid]<target<=A[r]
A[mid]>A[r]:右半段无序;target>A[mid] 或者 target<=A[r]
左闭右闭 (推荐,因为要用取A[r])
class Solution {
public:
int search(vector<int> &A, int target) {
int l=0, r=A.size()-1;
while(l<=r){
int mid = l+(r-l)/2;
if(A[mid]==target) return mid;
else if((A[mid]>A[r] && (target>A[mid] || target<=A[r]))
|| (A[mid]<A[r] && target>A[mid] && target<=A[r])) l=mid+1;
else r=mid-1;
}
return -1;
}
};
左闭右开 (是用r-1,因为r不在取值范围中)
class Solution {
public:
int search(vector<int> &A, int target) {
int l=0, r=A.size();
while(l<r){
int mid = l+(r-l)/2;
if(A[mid]==target) return mid;
else if((A[mid]>A[r-1] && (target>A[mid] || target<=A[r-1]))
|| (A[mid]<A[r-1] && target>A[mid] && target<=A[r-1])) l=mid+1;
else r=mid;
}
return -1;
}
};
思路2
左闭右闭
class Solution {
public:
int search(vector<int> &A, int target) {
int l=0, r=A.size()-1;
while(l<=r){
int mid = l+(r-l)/2;
if(A[mid]==target) return mid;
else if(A[mid]<A[r]){ //右半段有序
if(target>A[mid] && target<=A[r]) l=mid+1;
else r=mid-1;
}else{ // 左半段有序
if(target<A[mid] && target>=A[l]) r=mid-1;
else l=mid+1;
}
}
return -1;
}
};