- categories: Code, Interview Question, leetcode, Medium
- source: https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array
- topics: Binary Search, Array
Description
Given an array of integers nums
sorted in non-decreasing order, find the starting and ending position of a given target
value.
If target
is not found in the array, return [-1, -1]
.
You must write an algorithm with O(log n)
runtime complexity.
Idea
- Find left and right boundaries separately using binary search
- Check for edge cases in the end
Code
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if not nums:
return [-1, -1]
def find_leftmost(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
def find_rightmost(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return right
left_idx = find_leftmost(nums, target)
right_idx = find_rightmost(nums, target)
# Check if the target is actually in the range
if left_idx <= right_idx and left_idx < len(nums) and nums[left_idx] == target:
return [left_idx, right_idx]
else:
return [-1, -1]