給定乙個按照公升序排列的整數陣列 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]
1.二分找到乙個target然後以這個target作為中間向左右兩邊找到邊界,極端情況陣列都是target時退化到o(n)
2.2個二分,乙個找左邊,乙個找右邊。注意這裡左邊的返回值要麼是0(到最左沒找到)/n+1(到最右沒找到)
class solution(object):
def searchrange(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: list[int]
"""if not nums:
return [-1,-1]
left = 0
right = len(nums) - 1
while left <= right:
mid = left+(right-left)//2
if nums[mid]==target:
res_left = res_right = mid
while res_left>=1 and nums[res_left]==nums[res_left-1]:
res_left-=1
while res_right<=len(nums)-2 and nums[res_right]==nums[res_right+1]:
res_right+=1
return [res_left,res_right]
elif nums[mid]>target:
right=mid-1
else:
left=mid+1
return [-1,-1]
class solution:
def extreme_insertion_index(self, nums, target, left):
lo = 0
hi = len(nums)-1
while lo <= hi:
mid = (lo + hi) // 2
if nums[mid] > target or (left and target == nums[mid]):
hi = mid-1
else:
lo = mid+1
return lo
def searchrange(self, nums, target):
left_idx = self.extreme_insertion_index(nums, target, true)
if left_idx == len(nums) or nums[left_idx] != target:
return [-1, -1]
return [left_idx, self.extreme_insertion_index(nums, target, false)-1]
class solution:
def searchrange(self, nums, target):
def search(flag):
l = 0
r = len(nums)-1
while l<=r:
mid = l+(r-l)//2
if nums[mid]>target or (flag and nums[mid]==target):
r = mid-1
else:
l = mid+1
return l
left = search(true)
if left==len(nums) or nums[left]!=target:
return [-1,-1]
return [left,search(false)-1]
34 在排序陣列中查詢元素的第乙個和最後乙個位置
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是o log n 級別。如果陣列中不存在目標值,返回 1,1 輸入 nums 5,7,7,8,8,10 target 8 輸出 3,4 輸入 nums 5,7,7,...
34 在排序陣列中查詢元素的第乙個和最後乙個位置
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8輸出 3,4 示例 2 輸入 n...
34 在排序陣列中查詢元素的第乙個和最後乙個位置
給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8輸出 3,4 示例 2 輸入 n...