leetcode 34. 在排序数组中查找元素的第一个和最后一个

2020-03-28  本文已影响0人  fanchuang

见注释。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        """
        32ms ** 97.23% ///// 14.6MB ** 5.07%
        换一种写法,重新组织代码,按照youtube上大神的模式来写 https://www.youtube.com/watch?v=bU-q1OJ0KWw
        1.整体上简洁清晰 2. 省去了边界处理的麻烦
        """
        left = self.findLeft(nums, target)
        right = self.findRight(nums, target)
        return [left, right]
    
    def findLeft(self, nums, target):
        left = -1       # 初始化
        start = 0
        end = len(nums) - 1
        while start <= end:
            middle = start + (end - start) // 2
            if nums[middle] >= target:                  # 这里的 >= 是很关键而且巧妙的一步,让它自身来突破边界
                end = middle - 1
            else:
                start = middle + 1
            if nums[middle] == target:
                left = middle
        return left 

    def findRight(self, nums, target):
        right = -1       # 初始化
        start = 0
        end = len(nums) - 1
        while start <= end:
            middle = start + (end - start) // 2
            if nums[middle] <= target:                  # 这里的 >= 是很关键而且巧妙的一步,让它自身来突破边界
                start = middle + 1
            else:
                end = middle - 1
            if nums[middle] == target:
                right = middle
        return right
 

        """
        44ms ** 78.04% ///// 14.4 ** 5.07%
        """
        # 二分查找  
        # 先尝试按照自己的老套路来写。然后按照youtube上大神的模式来写。分成几个小的方法来拼凑一起。
        # start = 0 
        # end = len(nums)-1 
        # found = False
        # while start <= end:
        #     middle = start + (end -start) // 2
        #     if nums[middle] == target:
        #         found = True
        #         break 
        #     elif nums[middle] > target:
        #         end = middle - 1 
        #     else:
        #         start = middle + 1

        # if not found:
        #     return [-1, -1]
        # else:
        #     # 说明找到了。此时可以获取 middle 的值,然后再往2侧扩展 
        #     # print(middle, nums[middle])
        #     left = middle
        #     right = middle 
        #     while left >-1 and nums[left] == target:
        #         left -= 1
        #     while right < len(nums) and nums[right] == target:
        #         right += 1 
        #     return [left+1, right-1]    # 这里也还是需要再还原一下的,因为上面的while里面又多操作了一下。

上一篇下一篇

猜你喜欢

热点阅读