← Binary Search

Find First and Last Position

Medium
Python
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)]
Java
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;
}

Key Insight

Python nested function. Java helper method with boolean param.

Python → Java Differences

  • Nested function vs helper method
  • Returns list vs int[]
  • Binary boundary identical
Python
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)]
Java
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;
}

Algorithm Steps

1. Binary search for leftmost
2. Binary search for rightmost