【力扣】在排序数组中查找元素的第一个和最后一个位置
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-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]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
解题思路:首先判断目标target值是否在数组当中,不在直接返回[-1,-1]结束程序
如果在,对数组进行循环,如果nums数组中存在等于目标值的元素,记录元素的下标值保存在列表$a$中,因为nums数组是严格升序排列的,所以,我们只需要返回列表$a$中的头尾元素,即为所得。
1 class Solution: 2 def searchRange(self, nums: List[int], target: int) -> List[int]: 3 if target not in nums: 4 return [-1,-1] 5 a = [] 6 for idx,item in enumerate(nums): 7 if item == target: 8 a.append(idx) 9 return [a[0],a[-1]]
进阶:二分查找
二分查找,搜索重复数字的左右边界。
采用二分查找的编程框架,只需注意当搜索左边界或右边界时,搜索区间分别向左侧或右侧收缩即可。
基本二分查找的编程框架:
1 left, right = 0, len(nums)-1 # 搜索区间是闭区间[left, right] 2 while left <= right: # while循环的 <= 符号,是由上面的搜索区间决定 3 mid = left + (right - left) // 2 4 if nums[mid] > target: 5 right = mid - 1 6 elif nums[mid] < target: 7 left = mid + 1 8 elif nums[mid] == target: 9 return mid # 此处直接返回了target的索引,搜索左/右侧边界时只需改动这里,并判断索引越界情况 10 return -1 11 12 作者:jue-qiang-zha-zha 13 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/34-zai-pai-xu-shu-zu-zhong-cha-zhao-yuan-irqc/ 14 来源:力扣(LeetCode)
代码:
1 class Solution: 2 def searchRange(self, nums: List[int], target: int) -> List[int]: 3 # 二分查找,搜索左右边界 4 if not nums: 5 return [-1, -1] 6 return [self._search_left(nums, target), self._search_right(nums, target)] 7 8 def _search_left(self, nums, target): 9 left, right = 0, len(nums) - 1 10 while left <= right: 11 mid = left + (right - left) // 2 12 if nums[mid] > target: 13 right = mid - 1 14 elif nums[mid] < target: 15 left = mid + 1 16 elif nums[mid] == target: 17 right = mid - 1 # 改动这里,使搜索区间向左侧收缩 18 if left >= len(nums) or nums[left] != target: # 判断索引越界情况 19 return -1 20 return left 21 22 def _search_right(self, nums, target): 23 left, right = 0, len(nums) - 1 24 while left <= right: 25 mid = left + (right - left) // 2 26 if nums[mid] > target: 27 right = mid - 1 28 elif nums[mid] < target: 29 left = mid + 1 30 elif nums[mid] == target: 31 left = mid + 1 # 改动这里,使搜索区间向右侧收缩 32 if right < 0 or nums[right] != target: # 判断索引越界情况 33 return -1 34 return right 35 36 作者:jue-qiang-zha-zha 37 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/34-zai-pai-xu-shu-zu-zhong-cha-zhao-yuan-irqc/ 38 来源:力扣(LeetCode)
浙公网安备 33010602011771号