标签:target nums Python 位置 索引 查找 目标值 leetcode34 start
题目:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
思路:
二分查找,根据要求的时间复杂度,肯定要用二分查找,这里要进行两次二分查找,第一次
是要找大于或者等于目标值的左边界,第二次
是要找第一个大于目标值的元素索引,这个索引位置减1就是结束位置。
写一个二分查找的函数,然后两次调用此函数找到开始和结束位置,找结束位置将目标值加1,来找第一个大于目标值的元素索引,最后得到开始和结束位置。
先判断如果开始位置索引等于数组长度,说明一直找到最后一个元素都没找到大于或者等于目标值的元素,或者返回的开始位置的数,确实大于目标值,但是不等于目标值,都说明数组中没有这个元素,直接返回[-1,-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]
def binarysearch(numss,target):
left,right = 0,len(nums)-1
while left <= right:# 当左右指针相等时,也需要判断是否符合条件
mid = (left + right) // 2
if nums[mid] >= target:# 找大于等于目标值的左边界
right = mid - 1
else:
left = mid + 1
return left
start = binarysearch(nums,target)
end = binarysearch(nums,target+1) - 1 # 找第一个大于目标值的元素索引,再减1就是结束位置
# if nums[start] != target or start == len(nums): 条件1满足了,后边索引就会报错
if start == len(nums) or nums[start] != target:
# 如果最后一个元素都不是目标值,或者找到的索引位置的数不是目标值
return [-1,-1]
else:
return [start,end]
标签:target,nums,Python,位置,索引,查找,目标值,leetcode34,start 来源: https://blog.csdn.net/qq_36849855/article/details/119898349
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。