---
# System prepended metadata

title: 34. Find First and Last Position of Element in Sorted Array
tags: [Leetcode, binary search, medium, python, Top 100 Liked Questions]

---

###### tags: `Leetcode` `medium` `binary search` `python` `Top 100 Liked Questions`

# 34. Find First and Last Position of Element in Sorted Array

## [題目連結:] https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/

## 題目:
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.

**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]
```

## 解題想法:
* 題目要求，找target在數組中最左邊與最右邊出現的位置，若無，返回-1
* 看到O(log n) runtime complexity: Binary Search
    * 分別做兩次binary Search，
    * 第一次求最左邊出現的位置:
        * if target==nums[mid]:
            * firstPos=mid
            * **right=mid-1** 往左半邊移動
    * 第二次求最右邊出現的位置:
        * if target==nums[mid]:
            * lastPos=mid
            * **left=mid+1** 往右半邊移動

## Python:
``` python=
class Solution(object):
    def searchRange(self, nums, target):
        return [self.findFirst(nums,target),self.findLast(nums,target)]

    def findFirst(self,nums,target):
        left = 0
        right = len(nums)-1
        firstPos = -1
        while left<=right:
            mid = (left+right)//2
            if target==nums[mid]:
                firstPos = mid
                #格局移置左半check
                right = mid-1
            elif target<nums[mid]:
                right = mid-1
            else:
                left = mid+1
        return firstPos

    def findLast(self,nums,target):
        left = 0
        right = len(nums)-1
        lastPos = -1
        while left<=right:
            mid = (left+right)//2
            if target==nums[mid]:
                lastPos=mid
                #往右半check
                left = mid+1
            elif target<nums[mid]:
                right= mid-1
            else:
                left =mid+1
        return lastPos


if __name__ == '__main__':
    result = Solution()
    nums = [5,7,7,8,8,10]
    target = 8
    ans = result.searchRange(nums,target)
    print(ans)
#Input: nums = [5,7,7,8,8,10], target = 8
#Output: [3,4]
```