您的位置:首页 > 教育 > 培训 > aspcms系统_工厂管理系统软件_徐州网站设计_什么网站都能打开的浏览器

aspcms系统_工厂管理系统软件_徐州网站设计_什么网站都能打开的浏览器

2025/4/3 18:15:21 来源:https://blog.csdn.net/qq_51906990/article/details/146965662  浏览:    关键词:aspcms系统_工厂管理系统软件_徐州网站设计_什么网站都能打开的浏览器
aspcms系统_工厂管理系统软件_徐州网站设计_什么网站都能打开的浏览器

题目:

给一个按照非递减顺序排列的整数数组nums,和一个目标值target,请找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值target,返回[-1,-1]


方法一:二分查找

直观的思路肯定是从前往后遍历一遍。用两个变量记录第一次和最后一次遇见 target 的下标,但这个方法的时间复杂度为 O(n),没有利用到数组升序排列的条件

由于数组已经排序,因此整个数组是单调递增的,可以利用二分法来加速查找的过程。

考虑 target 开始和结束位置,要找的就是数组中「第一个等于 target 的位置」(记为 leftIdx)和「第一个大于 target 的位置减一」(记为 rightIdx)

二分查找中,寻找 leftIdx 即为在数组中寻找第一个大于等于 target 的下标,寻找 rightIdx 即为在数组中寻找第一个大于 target 的下标,然后将下标减一。两者的判断条件不同,定义binarySearch(nums, target, lower) 表示在 nums 数组中二分查找 target 的位置,如果 lower 为 true,则查找第一个大于等于 target 的下标,否则查找第一个大于 target 的下标。

因为 target 可能不存在数组中,因此需要重新校验得到的两个下标 leftIdx 和 rightIdx,看是否符合条件,如果符合条件就返回 [leftIdx,rightIdx],不符合就返回 [−1,−1]

class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""leftIdx=self.binarySearch(nums,target,True)#查找左边界,第三个参数True表示查找左边界rightIdx=self.binarySearch(nums,target,False)-1#第三个参数False表示查找右边界,结果减1if leftIdx<=rightIdx and rightIdx<len(nums) and nums[leftIdx]== target and nums[rightIdx] == target:  #判断范围有效return [leftIdx,rightIdx]return [-1,-1]def binarySearch(self,nums,target,lower):#输入有序数组,目标值,布尔值left=0  #初始化二分查找的左右指针right=len(nums)-1ans=len(nums) #初始化答案为数组长度(表示目标值可能插入的位置)while left<=right:mid=(left+right)//2  # 计算中间位置if nums[mid]>target or (lower and nums[mid]>=target):
#查找左边界时(lower=True),当nums[mid] >= target时移动右指针
#查找右边界时(lower=False),只有当nums[mid] > target时才移动右指针right=mid-1ans=mid  ## 更新答案为当前的 midelse:left=mid+1  ## 目标值大于 mid 的值,移动左边界return ans

时间复杂度: O(logn) ,其中 n 为数组的长度。二分查找的时间复杂度为 O(logn),一共会执行两次,因此总时间复杂度为 O(logn)

空间复杂度:O(1)

作者:力扣官方题解
 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com