Harukaze

 

【力扣】在排序数组中查找元素的第一个和最后一个位置

来源:力扣(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)

 

 

 

 



posted on 2021-04-11 16:14  Harukaze  阅读(119)  评论(0)    收藏  举报

导航