def search_range(nums,target):
def find(left):
l,r=0,len(nums)-1; idx=-1
while l<=r:
mid=(l+r)//2
if nums[mid]==target:
idx=mid
if left: r=mid-1
else: l=mid+1
elif nums[mid]<target: l=mid+1
else: r=mid-1
return idx
return [find(True),find(False)]
public int[] searchRange(int[] nums,int target){
return new int[]{find(nums,target,true),find(nums,target,false)};
}
int find(int[] nums,int target,boolean left){
int l=0,r=nums.length-1,idx=-1;
while(l<=r){
int mid=(l+r)/2;
if(nums[mid]==target){idx=mid;if(left)r=mid-1;else l=mid+1;}
else if(nums[mid]<target) l=mid+1;
else r=mid-1;
} return idx;
}
Python nested function. Java helper method with boolean param.
def search_range(nums,target):
def find(left):
l,r=0,len(nums)-1; idx=-1
while l<=r:
mid=(l+r)//2
if nums[mid]==target:
idx=mid
if left: r=mid-1
else: l=mid+1
elif nums[mid]<target: l=mid+1
else: r=mid-1
return idx
return [find(True),find(False)]
public int[] searchRange(int[] nums,int target){
return new int[]{find(nums,target,true),find(nums,target,false)};
}
int find(int[] nums,int target,boolean left){
int l=0,r=nums.length-1,idx=-1;
while(l<=r){
int mid=(l+r)/2;
if(nums[mid]==target){idx=mid;if(left)r=mid-1;else l=mid+1;}
else if(nums[mid]<target) l=mid+1;
else r=mid-1;
} return idx;
}
1. Binary search for leftmost 2. Binary search for rightmost