0
点赞
收藏
分享

微信扫一扫

【LeetCode】34.在排序数组中查找元素的第一个和最后一个位置


总结

  • 经典题目,一定得熟练。

题目

【LeetCode】34.在排序数组中查找元素的第一个和最后一个位置_算法

思想

要熟练掌握二分搜索的特性。

  • 错误思想
    我的一个想法是,既然要求target的下界和上界。平常的二分搜索都只能找到下界,上界是搞不出来的。那么能不能调整成搜索target+1的下界,这样就解决了这个问题?这么做是不合理的。例如:数组 ​​[5,6,7,8,8,10]​​ 如果我们要判断target=10,那么上界判断target+1=11的时候,这个上界就超出了数组下标,是无法解决的。
  • 正确的解法
    分别找出target所在的下界和上界。

代码

class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if len(nums) == 0:
return [-1,-1]
left = self.bi_search_left(nums,target)
# print(left)
if left == -1:
return [-1,-1]
else:
right = self.bi_search_right(nums,target)
# print(left,right-1)
return [left,right-1]

# 定义一个二分查找的方法,如果与该值相等,则返回该值第一次出现的位置;如果该值未出现,则返回-1
def bi_search_left(self,nums,target):
low = 0
high = len(nums) -1
while(low < high):
mid = (low+high) // 2
if(nums[mid] > target):
high = mid - 1
elif nums[mid] < target:
low = mid + 1
elif nums[mid] == target: # 如果值相等
high = mid # 不能减一,因为可能就是目标位置
if nums[low] != target: # 说明没有找到,直接返回-1
return -1
return low # 返回需要的下标


# 定义一个二分查找的方法,如果与该值相等,则返回该值最后一次出现的位置;如果该值未出现,则
def bi_search_right(self,nums,target):
low = 0
high = len(nums) -1
while(low <= high):
mid = (low+high) // 2
if(nums[mid] > target):
high = mid - 1
elif nums[mid] <= target:
low = mid + 1

# if nums[low] != target: # 说明没有找到,直接返回-1
# return -1
return low # 返回需要的下标


举报

相关推荐

0 条评论