34. 在排序数组中查找元素的第一个和最后一个位置
原思路
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
if n == 0:
return [-1, -1]
l, r = 0, n-1
while l <= r:
mid = (l+r)/2
if nums[mid] == target:
res_l = mid
res_r = mid
while res_l >= 0 and nums[res_l] == target:
res_l -= 1
while res_r < n and nums[res_r] == target:
res_r += 1
return [res_l + 1, res_r - 1]
elif nums[mid] < target:
l = mid + 1
else:
r = mid - 1
return [-1, -1]
思路:
二分搜索,找到target对应值,找到等于target的左右边界。时间复杂度其实还是O(n)。
官方思路
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
if n == 0:
return [-1, -1]
def searchTarget(nums, n, if_left):
l, r = 0, n
while l < r:
mid = (l+r)/2
if (if_left and nums[mid] == target) or nums[mid] > target:
r = mid
else:
l = mid + 1
return l
left_index = searchTarget(nums, n, True)
if left_index == n or nums[left_index] != target:
return [-1, -1]
return [left_index, searchTarget(nums, n, False)-1]
思路:
应该2次搜索,分别找等于target的左右边界。时间复杂度是O(logn)。
注意点:
找到某个target向2边找的思路其实不对。时间复杂度高。