返回

寻路力扣,算法之巅:在排序数组中寻觅目标元素

前端

力扣题解:探寻算法奥秘

在计算机科学的浩瀚海洋中,力扣平台犹如一座巍峨的灯塔,指引着程序员们探寻算法的奥秘。而「在排序数组中查找元素的第一个和最后一个位置」这一题目,更是算法竞赛中的常客,考验着程序员们的逻辑思维和算法掌握能力。

算法剖析:二分查找之妙

要解决这一问题,二分查找无疑是我们的利器。二分查找是一种高效的搜索算法,通过不断将搜索范围缩小一半,快速定位目标元素。其精髓在于:

  1. 初始化: 将搜索范围设为数组的整个区间。
  2. 判定: 计算区间中点,与目标元素比较:
    • 相等:则找到目标元素。
    • 大于:则目标元素在区间左侧。
    • 小于:则目标元素在区间右侧。
  3. 递归: 根据判定结果,将搜索范围缩小一半并重复步骤 2。

寻觅目标元素的轨迹

有了二分查找的指引,我们踏上了寻觅目标元素的征程:

  1. 首次出现: 二分查找找到第一个满足条件(相等)的元素位置,即目标元素的第一个位置。
  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]

结语:算法的魅力

通过对力扣题目「在排序数组中查找元素的第一个和最后一个位置」的深入解析,我们领略了算法的魅力。算法不仅是一门逻辑思维的艺术,更是一套解决复杂问题的有力工具。希望这篇文章能帮助各位程序员在算法竞赛中披荆斩棘,在技术之路上攀登更高峰。