Find First and Last Position — Dual Left/Right Boundary
Advertisement
Problem 309 · Find First and Last Position of Element in Sorted Array
Difficulty: Medium · Pattern: Left + Right Boundary
Solutions
# Python
def searchRange(nums, target):
def left_bound():
lo, hi = 0, len(nums)
while lo < hi:
mid = (lo+hi)//2
if nums[mid] < target: lo = mid+1
else: hi = mid
return lo
def right_bound():
lo, hi = 0, len(nums)
while lo < hi:
mid = (lo+hi)//2
if nums[mid] <= target: lo = mid+1
else: hi = mid
return lo-1
l = left_bound()
if l == len(nums) or nums[l] != target: return [-1,-1]
return [l, right_bound()]
// Java
public int[] searchRange(int[] nums, int target) {
int left=lb(nums,target), right=rb(nums,target);
if (left==nums.length||nums[left]!=target) return new int[]{-1,-1};
return new int[]{left,right};
}
int lb(int[] nums, int t) { int lo=0,hi=nums.length; while(lo<hi){int m=(lo+hi)/2;if(nums[m]<t)lo=m+1;else hi=m;} return lo; }
int rb(int[] nums, int t) { int lo=0,hi=nums.length; while(lo<hi){int m=(lo+hi)/2;if(nums[m]<=t)lo=m+1;else hi=m;} return lo-1; }
Complexity
- Time: O(log n)
- Space: O(1)
Advertisement