34 在排序陣列中查詢元素的第乙個和最後乙個位置

2021-10-03 16:34:30 字數 2155 閱讀 8580

給定乙個按照公升序排列的整數陣列 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...