第一次自己试了好多次,完成了中等难度的题。
题目描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回[-1, -1]。
进阶:
你可以设计并实现时间复杂度为O(log n)的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[3,4]
思路:
这个题是找边界,我们如果用二分查找可以演变成找左边界和有边界的问题。
左边界满足什么条件呢?
首先左边界要等于target,并且左边界前面一个元素要小于target,那么有个问题就是如果左边界前面没有元素了呢?所以在左边界判定为等于target了,还要判断左边界前面是不是有元素,即左边界是不是最左边的元素。如果左边界是最左边的元素,那么可以直接返回左边界的下标,如果左边界不是最左边的元素,那么还要判断左边界前面一个元素是不是小于target,如果左边界前面一个元素小于target,那么返回左边界的下标,否则查找的范围往左移。
同理,我们可以找右边界。
class Solution:
def searchRange(self, nums: list, target: int) -> list:
def searchLeftRange():
start = 0
end = len(nums) - 1
while start <= end:
mid = (start + end)//2
if nums[mid] == target:
if mid == 0:
return mid
else:
if nums[mid-1] < target:
return mid
else:
end = mid - 1
elif nums[mid] < target:
start = mid + 1
else:
end = mid - 1
return -1
def searchRightRange():
start = 0
end = len(nums) - 1
while start <= end:
mid = (start + end)//2
if nums[mid] == target:
if mid == len(nums) - 1:
return mid
else:
if nums[mid + 1] > target:
return mid
else:
start = mid + 1
elif nums[mid] < target:
start = mid + 1
else:
end = mid - 1
return -1
list_a = []
a1=searchLeftRange()
a2=searchRightRange()
list_a.append(a1)
list_a.append(a2)
return list_a