# 34. Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
# Solution
Approach 1: Binary search.
# Code (Python)
Approach 1:
class Solution:
def searchRange(self, nums, target):
if not nums or target < nums[0] or target > nums[-1]:
return [-1, -1]
# implementing python's bisect.bisect_left()
low = self._bisect_left(nums, target)
if low < len(nums) and nums[low] == target:
return [low, self._bisect_left(nums, target + 1) - 1]
return [-1, -1]
def _bisect_left(self, nums, target):
# return the index that target would be able to insert into. if there are existing targets, return the leftmost position.
start, end = 0, len(nums) # SPECIAL NOTE: len(nums) is also valid -- when target > nums[-1]
while start < end: # pointers always move after an iteration so in the end, start == end is guaranteed
mid = (start + end) // 2
if nums[mid] >= target:
end = mid
else:
start = mid + 1
return start
# Code (C++)
Approach 1:
class Solution {
private:
int searchTarget(vector<int>& nums, int target) {
int head = 0;
int tail = nums.size() - 1;
while (head <= tail)
{
int mid = head + (tail - head) / 2;
if (target <= nums[mid])
tail = mid - 1;
else
head = mid + 1;
}
return head;
}
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> targetRange;
int head = -1;
int tail = -1;
if (nums.size() > 0)
{
head = searchTarget(nums, target);
if (head >= nums.size() || nums[head] != target)
head = -1;
tail = searchTarget(nums, target + 1) - 1;
if (tail < 0 || nums[tail] != target)
tail = -1;
}
targetRange.push_back(head);
targetRange.push_back(tail);
return targetRange;
}
};