# LC 34. Find First and Last Position of Element in Sorted Array ### [Problem link](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/) ###### tags: `leedcode` `python` `medium` `Binary Search` Given an array of integers <code>nums</code> sorted in non-decreasing order, find the starting and ending position of a given <code>target</code> value. If <code>target</code> is not found in the array, return <code>[-1, -1]</code>. You mustwrite an algorithm with<code>O(log n)</code> runtime complexity. **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] ``` **Example 3:** ``` Input: nums = [], target = 0 Output: [-1,-1] ``` **Constraints:** - <code>0 <= nums.length <= 10<sup>5</sup></code> - <code>-10<sup>9</sup><= nums[i]<= 10<sup>9</sup></code> - <code>nums</code> is a non-decreasing array. - <code>-10<sup>9</sup><= target<= 10<sup>9</sup></code> ## Solution 1 - Binary Search #### Python ```python= class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: n = len(nums) # find left position left, right = 0, n - 1 while left <= right: mid = (left + right) // 2 if nums[mid] >= target: right = mid - 1 else: left = mid + 1 left_pos = left # find right position left, right = 0, n - 1 while left <= right: mid = (left + right) // 2 if nums[mid] > target: right = mid - 1 else: left = mid + 1 right_pos = right return [left_pos, right_pos] if left_pos <= right_pos else [-1, -1] ``` #### C++ ```cpp= class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { int n = nums.size(); // find left position int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] >= target) { right = mid - 1; } else { left = mid + 1; } } int leftPos = left; // find right position left = 0; right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] > target) { right = mid - 1; } else { left = mid + 1; } } int rightPos = right; if (leftPos <= rightPos) { return {leftPos, rightPos}; } else { return {-1, -1}; } } }; ``` >### Complexity >n = nums.length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(logn) | O(1) | ## Note 一次找一邊