Leetcode-34. Find First and Last Position of Element in Sorted Array 在排序数组中查找元素的第一个和最后一个位置 (二分查找)

题目

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
链接:https://leetcode.com/problems/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:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

思路及代码

二分查找

  1. 先找到任意一个target的位置,然后向两边发散找边界
class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        low = 0
        high = len(nums)
        find = False
        while low < high:
            mid = int((low+high) / 2)
            if nums[mid] > target:
                high = mid
            elif nums[mid] < target:
                low = mid + 1
            else:
                find = True
                break
        if not find:
            return [-1, -1]
        temp = mid
        while temp < len(nums) and nums[temp] == target:
            temp += 1
        while mid >= 0 and nums[mid] == target:
            mid -= 1
        return [mid+1, temp-1]
  1. 分别找到左边界和右边界
class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:     
        def firstpos(nums, target):
            low = 0
            high = len(nums)
            while low < high:
                mid = int((low+high) / 2)
                if nums[mid] < target:
                    low = mid + 1
                else:
                    high = mid
                
            if high == len(nums) or nums[low] != target:
                return -1
            return low
        
        def lastpos(nums, target):
            low = 0
            high = len(nums)
            while low < high:
                mid = int((low+high) / 2)
                if nums[mid] <= target:
                    low = mid + 1
                else:
                    high = mid
            low -= 1
            if low < 0 or nums[low] != target:
                return -1
            return low
        
        return [firstpos(nums,target), lastpos(nums, target)]

复杂度

T = O ( l o g n ) O(logn) O(logn)
S = O ( 1 ) O(1) O(1)

你可能感兴趣的:(Leetcode,leetcode,算法,python,二分法)