当前位置: 首页 > 后端技术 > Python

LeetCode34.查找排序数组中元素的第一个和最后一个位置-蟒蛇

时间:2023-03-25 20:39:14 Python

34。查找排序数组中元素的第一个和最后一个位置题目来源:LeetCodehttps://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array题目给定一个升序排列的整数nums数组,以及一个目标值target。找出给定目标值在数组中的开始和结束位置。你的算法时间复杂度必须是O(logn)级别。如果数组中不存在目标值,则返回[-1,-1]。示例1:输入:nums=[5,7,7,8,8,10],target=8输出:[3,4]示例2:输入:nums=[5,7,7,8,8,10],target=6Output:[-1,-1]解题思路:二分查找题目解释,[算法时间复杂度必须是O(logn)级别],题目的意思是说给定的数组是已经升序了。所以这里,我们考虑使用二分查找的方法来解决这个问题。这里,如果没有上述约束,问题可以在线性时间内解决。具体实现过程:先从左到右遍历数组,当第一个元素与目标值相同时,记录索引,跳出循环。如果循环直到循环结束都没有遇到目标值相同的元素,则直接返回[-1,-1]。第二次遍历,从右向左遍历,同样遇到第一个等于目标值的元素,记录索引,退出循环。最终返回两个索引值。以上是在不限制时间复杂度的情况下,在线性时间内解决问题。代码部分建议大家可以尝试写一下,这里就不贴了。下面主要讲一下如何使用二分查找来解决问题。这里最左边和最右边对应值的索引也都查找了两次。这里需要注意的是,不管是找最左边的元素索引还是最右边的元素索引,当找到目标值相同的元素索引时,都不会立即停止,因为元素会重复出现,找到的第一个不一定是最左边或最右边的元素。最右边的元素。这里需要注意的是,在查找左右两边的元素时,需要注意的是边界问题。这里通过和短路计算引入变量符号来处理边界问题。当元素值与目标值相同时,如果sign为True,此时应该搜索左边部分。如果当前元素值等于target,那么最左边的元素索引不能大于当前元素索引,所以范围应该缩小到左边部分。同样,求最右索引也是一样的。具体代码实现如下。代码实现类解决方案:defsearchRange(self,nums:List[int],target:int)->List[int]:defsearch_index(nums,target,sign):left=0right=len(nums)whilelefttargetor(signandtarget==nums[mid]):right=midelse:left=mid+1returnleftleft_index=search_index(nums,target,True)#这里提前判断检索到的索引是否已经结束#或者检索到的索引对应的值是否不是target,#如果是以上两种情况,直接返回[-1,-1]ifleft_index==len(nums)ornums[left_index]!=target:return[-1,-1]right_index=search_index(nums,target,False)-1return[left_index,right_index]实现结果