题目链接
难度:中等 类型: 二分搜索
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例1
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例2
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
解题思路
用两次二分搜索,一次找左边界,一次找右边界
找两个边界的方式不太一样
找左边界时,若nums[mid]==target,要移动右指针
找右边界时,若nums[mid]==target,要移动左指针
找右边界时,左指针直接指向左边界会减小搜索范围
代码实现
class Solution(object):
def search_border(self, nums, target, l, is_left):
r = len(nums)
while l<r:
mid = (l+r)//2
if nums[mid]>target or (is_left and target==nums[mid]):
r = mid
else:
l = mid + 1
return l
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
left = self.search_border(nums, target, 0, True)
if left==len(nums) or nums[left]!=target:
return [-1,-1]
right = self.search_border(nums, target, left, False) - 1
return [left, right]