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)whileleft
