Leetcode 034: Find First and Last Position of Element in Sorted Array

题目:

image.png

  这道题应该是属于比较明显的用二分法的题。首先通过二分法找到该元素在数组中首次出现的位置,若通过一次查找该元素没有出现在该列表中,则直接返回[-1, -1]。找到了first position后,从该位置到列表末尾这个区间再次通过二分法寻找该元素最右边的位置。代码如下,主要参考:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if not nums: return [-1 ,-1]
        # find the first position:
        lo, hi = 0, len(nums)-1
        def check1(mid):
            return nums[mid] < target
        while lo < hi:
            mid = lo + (hi - lo) // 2
            if check1(mid): lo = mid + 1
            else: hi = mid
        l = lo
        # 若是第一遍二分法发现该元素在列表中没有出现,则直接返回[-1, -1]
        if nums[l] != target:
            return [-1, -1]

        # find the last position:
        lo, hi = l, len(nums) -1
        def check2(mid):
            return nums[mid] <= target
        while lo < hi:
            mid = lo + (hi - lo + 1) // 2
            if check2(mid): lo = mid
            else: hi = mid - 1
        r = hi
        return [l, r]

  或者可以直接使用python自带的bisect库里的函数实现:

class Solution:
    def searchRange2(self, nums: List[int], target: int) -> List[int]:
        if not nums: return [-1, -1]
        # bisect_left可以获得target插入nums中的位置,若有相同元素则返回最左边的位置
        # bisect_right则是返回最右边的位置
        # 例 nums = [1,2,2,3], target = 2
        # 则bisect_left(nums, target) = 1; bisect_right(nums, target) = 3
        l = bisect.bisect_left(nums, target)
        if l >= len(nums) or nums[l] != target: return [-1, -1]
        r = bisect.bisect_right(nums, target)
        return [l, r - 1]

你可能感兴趣的:(Leetcode 034: Find First and Last Position of Element in Sorted Array)