给定一个按照升序排列的整数数组 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
i=0
j=len(nums)-1
bChanged=False
while (i<=j):
if((nums[i]==target )and(nums[j]==target) ):
bChanged=True
break
if(nums[i]!=target):
i+=1
if(nums[j]!=target):
j-=1
if(bChanged):
return [i,j]
else :
return [-1,-1]
class Solution:
def search_index(self ,nums,target,LeftOrRight):
left=0
right=len(nums)
while (left<right):
mid=(left+right)//2
if((nums[mid]>target) or (LeftOrRight and nums[mid]==target)):
right=mid
elif((nums[mid]<target)or(not LeftOrRight and nums[mid]==target)):
left=mid+1
return left
def searchRange(self, nums, target):
left_index=self.search_index(nums,target,True)
if(len(nums)==1 and nums[0]==target):
return[0,0]
if( left_index >=len(nums) or len(nums)==0 or nums[left_index]!=target):
return [-1,-1]
right_index=self.search_index(nums,target,False)-1
return [left_index,right_index]
class Solution:
def searchRange(self, nums, target):
left=0
right=len(nums)-1
while (left<right):
mid=(left+right)/2
if(nums[mid]<target):
left=mid+1
elif(nums[mid]>=target):
right=mid
if(len(nums)==0 or nums[left]!=target):
return [-1,-1]
new_left=left
new_right=len(nums)-1
while (new_left<new_right):
mid=(new_left+new_right+1)/2
if(nums[mid]>target):
new_right=mid-1
elif(nums[mid]<=target):
new_left=mid
return[left,new_left]
根据题目要求运用二分查找即可,问题主要是边界条件的确定,没想到有啥好办法,我是通过一遍遍调试来搞的,
希望大神看到能教教我这个边界条件应该怎么搞。