python写很简单。
class Solution:
def search(self, nums, target):
try:
ans = nums.index(target)
except:
ans = -1
return ans
常规写的话,我看到一个比较好的二分法,就是确定mid的位置是属于rotated前还是后,然后二分逼近。
class Solution:
def search(self, nums, target):
beg, end = 0, len(nums)-1
while beg<=end:
mid = (beg+end)//2
if nums[mid] == target:
return mid
isAscendingLeft = nums[beg] <= nums[mid]
if isAscendingLeft:
if nums[beg] <= target < nums[mid]:
end = mid-1
else:
beg = mid+1
else:
if nums[mid] < target <= nums[end]:
beg = mid+1
else:
end = mid-1
return -1
还有c++写法:
class Solution {
public:
int search(int A[], int n, int target) {
int lo=0,hi=n-1;
// find the index of the smallest value using binary search.
// Loop will terminate since mid < hi, and lo or hi will shrink by at least 1.
// Proof by contradiction that mid < hi: if mid==hi, then lo==hi and loop would have been terminated.
while(lo<hi){
int mid=(lo+hi)/2;
if(A[mid]>A[hi]) lo=mid+1;
else hi=mid;
}
// lo==hi is the index of the smallest value and also the number of places rotated.
int rot=lo;
lo=0;hi=n-1;
// The usual binary search and accounting for rotation.
while(lo<=hi){
int mid=(lo+hi)/2;
int realmid=(mid+rot)%n;
if(A[realmid]==target)return realmid;
if(A[realmid]<target)lo=mid+1;
else hi=mid-1;
}
return -1;
}
};