34.在排序数组中查找元素的第一个和最后一个位置 二分法

本题解法照抄王尼玛的解答

 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/duo-tu-yan-shi-34-zai-pai-xu-shu-zu-zhong-cha-zhao/

思路:

  1. 当一道题出现了 排序数组+搜索 或者 排序数组+log(n)的时候,我们的第一反应肯定是二分法

难点:

  1. 用 log(n) 找到target没问题 ,关键是如何用log(n)找到其他两个端点。

关键操作:

  1. 在用循环找到了target之后,不要返回该下标,继续二分查找端点下标,直到找到

    1)边界  0 或  len(nums)-1

    2)  左端点左边 != target 或者  右端点右边 != target

    3)  一般二分法循环如下:

    l = 0

    r = len(nums)-1

    while l <= r : 

      mid = l + (r-l)//2

      if nums[ mid ] < target: 

        l = mid+1

      elif nums[ mid ] > target:

        r = mid -1 

      else:

        return mid 

代码:

  

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if not nums: return [-1,-1]
        def get_points(direction): 
            l = 0
            r = len(nums)-1
            while l<=r:
                mid = l + (r-l)//2
                if nums[mid]>target:
                    r = mid-1
                elif nums[mid]<target:
                    l = mid+1
                else:
                    if direction == 'left':
                        if mid>0 and nums[mid] == nums[mid-1]:
                            r = mid-1
                        else:
                            return mid

                    else:
                        if mid<len(nums)-1 and nums[mid] == nums[mid+1]:
                            l = mid+1
                        else:
                            return mid
            return -1
        return [get_points('left'),get_points('right')]

猜你喜欢

转载自www.cnblogs.com/ChevisZhang/p/12888037.html