📜  查找在排序数组中一次出现的元素(1)

📅  最后修改于: 2023-12-03 14:55:33.380000             🧑  作者: Mango

在排序数组中查找一次出现的元素

当我们需要在一个排序数组中查找一个元素时,通常会使用二分查找算法。但是,如果我们需要查找一个元素在数组中第一次或最后一次出现的位置时,我们需要进行一些特殊的操作。

查找元素第一次出现的位置

我们可以使用修改版的二分查找算法,寻找第一个等于目标元素的位置。具体步骤如下:

  1. 初始化起始下标 start 为 0,终止下标 end 为数组长度 n-1
  2. start <= end 时执行下列操作:
    1. 计算中间下标 mid,其中 mid = (start+end) / 2
    2. 如果目标元素等于 nums[mid],则说明第一次出现的位置在前半部分数组,将 end = mid - 1
    3. 如果目标元素小于 nums[mid],则说明目标元素在前半部分数组,将 end = mid - 1
    4. 如果目标元素大于 nums[mid],则说明目标元素在后半部分数组,将 start = mid + 1
  3. 遍历结束后,如果数组中存在目标元素,返回其第一次出现的下标 start,否则返回 -1。

下面是 Python 代码实现:

def search_first_occurrence(nums, target):
    start, end = 0, len(nums)-1
    while start <= end:
        mid = (start+end) // 2
        if nums[mid] == target:
            end = mid - 1
        elif nums[mid] < target:
            start = mid + 1
        else:
            end = mid - 1
    if start < len(nums) and nums[start] == target:
        return start
    return -1
查找元素最后一次出现的位置

按照与上面类似的方法,我们可以找到最后一次出现的位置。具体步骤如下:

  1. 初始化起始下标 start 为 0,终止下标 end 为数组长度 n-1
  2. start <= end 时执行下列操作:
    1. 计算中间下标 mid,其中 mid = (start+end) / 2
    2. 如果目标元素等于 nums[mid],则说明最后一次出现的位置在后半部分数组,将 start = mid + 1
    3. 如果目标元素小于 nums[mid],则说明目标元素在前半部分数组,将 end = mid - 1
    4. 如果目标元素大于 nums[mid],则说明目标元素在后半部分数组,将 start = mid + 1
  3. 遍历结束后,如果数组中存在目标元素,返回其最后一次出现的下标 end,否则返回 -1。

下面是 Python 代码实现:

def search_last_occurrence(nums, target):
    start, end = 0, len(nums)-1
    while start <= end:
        mid = (start+end) // 2
        if nums[mid] == target:
            start = mid + 1
        elif nums[mid] < target:
            start = mid + 1
        else:
            end = mid - 1
    if end >= 0 and nums[end] == target:
        return end
    return -1

以上是对于在排序数组中查找一次出现的元素的介绍和代码实现,希望对于您有所帮助。