def search(nums,target):
l,r=0,len(nums)-1
while l<=r:
mid=(l+r)//2
if nums[mid]==target: return mid
if nums[l]<=nums[mid]:
if nums[l]<=target<nums[mid]: r=mid-1
else: l=mid+1
else:
if nums[mid]<target<=nums[r]: l=mid+1
else: r=mid-1
return -1
public int search(int[] nums,int target){
int l=0,r=nums.length-1;
while(l<=r){
int mid=(l+r)/2;
if(nums[mid]==target) return mid;
if(nums[l]<=nums[mid]){
if(nums[l]<=target&&target<nums[mid]) r=mid-1;
else l=mid+1;
} else {
if(nums[mid]<target&&target<=nums[r]) l=mid+1;
else r=mid-1;
}
} return -1;
}
Python chained comparison elegant. Java needs two conditions with &&.
def search(nums,target):
l,r=0,len(nums)-1
while l<=r:
mid=(l+r)//2
if nums[mid]==target: return mid
if nums[l]<=nums[mid]:
if nums[l]<=target<nums[mid]: r=mid-1
else: l=mid+1
else:
if nums[mid]<target<=nums[r]: l=mid+1
else: r=mid-1
return -1
public int search(int[] nums,int target){
int l=0,r=nums.length-1;
while(l<=r){
int mid=(l+r)/2;
if(nums[mid]==target) return mid;
if(nums[l]<=nums[mid]){
if(nums[l]<=target&&target<nums[mid]) r=mid-1;
else l=mid+1;
} else {
if(nums[mid]<target&&target<=nums[r]) l=mid+1;
else r=mid-1;
}
} return -1;
}
1. Find sorted half 2. Check if target in sorted half