在排序数组中查找元素的第一个和最后一个位置

我的梦境 提交于 2020-03-02 16:42:43

题目:34. 在排序数组中查找元素的第一个和最后一个位置

解题思路

思路很简单,细节是魔鬼。
需要搞清楚:

  • r是取length还是length-1
  • 循环终止条件是否有等号,r和l指针的更新是否需要±1
  • 退出循环以后,是否需要再额外的判断
  • 返回的索引值是否需要-1

代码

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        len_n = len(nums)
        if len_n == 0: return [-1, -1]

        def find_left_marginal():
            l = 0
            r = len_n  # 搜索区间为[l, r)
            while l < r:  # l == r时[l, r)为空
                mid = l + (r - l) // 2
                if nums[mid] == target:
                    r = mid  # 没有立即返回,而是向左缩小区间
                elif nums[mid] > target:  # 分成[l, mid) [mid+1, r),以此来确定r和l的变化情况
                    r = mid
                else:
                    l = mid + 1
            if l == len_n: return -1  # 最终的返回值可以理解为数组中比target小的数的个数之和
            return l if nums[l] == target else -1

        def find_right_marginal():
            l = 0
            r = len_n  # 搜索区间为[l, r)
            while l < r:  # l == r时[l, r)为空
                mid = l + (r - l) // 2
                if nums[mid] == target:
                    l = mid + 1  # 没有立即返回,而是向右缩小区间
                elif nums[mid] > target:  # 分成[l, mid) [mid+1, r),以此来确定r和l的变化情况
                    r = mid
                else:
                    l = mid + 1
            if l == 0: return -1  # 注意
            return l-1 if nums[l-1] == target else -1  # 返回l-1是因为 之前l = m + 1,则m = l - 1

        left = find_left_marginal()
        right = find_right_marginal()
        return [left, right]


# s = Solution()
# nums = [5,7,7,8,8,10]
# target = 8
# print(s.searchRange(nums, target))

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!