返回
寻路力扣,算法之巅:在排序数组中寻觅目标元素
前端
2023-11-17 12:31:39
力扣题解:探寻算法奥秘
在计算机科学的浩瀚海洋中,力扣平台犹如一座巍峨的灯塔,指引着程序员们探寻算法的奥秘。而「在排序数组中查找元素的第一个和最后一个位置」这一题目,更是算法竞赛中的常客,考验着程序员们的逻辑思维和算法掌握能力。
算法剖析:二分查找之妙
要解决这一问题,二分查找无疑是我们的利器。二分查找是一种高效的搜索算法,通过不断将搜索范围缩小一半,快速定位目标元素。其精髓在于:
- 初始化: 将搜索范围设为数组的整个区间。
- 判定: 计算区间中点,与目标元素比较:
- 相等:则找到目标元素。
- 大于:则目标元素在区间左侧。
- 小于:则目标元素在区间右侧。
- 递归: 根据判定结果,将搜索范围缩小一半并重复步骤 2。
寻觅目标元素的轨迹
有了二分查找的指引,我们踏上了寻觅目标元素的征程:
- 首次出现: 二分查找找到第一个满足条件(相等)的元素位置,即目标元素的第一个位置。
- 再次出现: 继续二分查找,这次的目标是找到最后一个满足条件(相等)的元素位置,即目标元素的最后一个位置。
代码实现:清晰简洁
有了算法的指引,代码实现便水到渠成:
def search_range(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
left, right = 0, len(nums) - 1
# 寻找第一个目标元素的位置
while left <= right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
else:
break
if left > right or nums[mid] != target:
return [-1, -1]
# 寻找最后一个目标元素的位置
first = mid
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
else:
first = mid
right = mid - 1
return [first, last]
结语:算法的魅力
通过对力扣题目「在排序数组中查找元素的第一个和最后一个位置」的深入解析,我们领略了算法的魅力。算法不仅是一门逻辑思维的艺术,更是一套解决复杂问题的有力工具。希望这篇文章能帮助各位程序员在算法竞赛中披荆斩棘,在技术之路上攀登更高峰。