📅  最后修改于: 2023-12-03 15:36:22.716000             🧑  作者: Mango
在排序过的数组中查找给定元素的索引可以使用二分查找算法,它的时间复杂度为O(log n)。
首先,在排序后的数组中搜索给定元素,找到它的位置,然后在它的左边和右边继续搜索直到找到所有的相同元素的位置。
以下是一个Python示例代码:
def binary_search(arr, left, right, x):
"""
二分查找算法,返回给定元素的索引
"""
if right >= left:
mid = (right + left) // 2
if arr[mid] == x:
return mid
elif arr[mid] > x:
return binary_search(arr, left, mid - 1, x)
else:
return binary_search(arr, mid + 1, right, x)
else:
return -1
def find_indices(arr, x):
"""
查找给定元素在排序后的数组中的所有索引
"""
index = binary_search(arr, 0, len(arr) - 1, x)
if index == -1:
return []
else:
indices = [index]
i = index - 1
while i >= 0 and arr[i] == x:
indices.append(i)
i -= 1
i = index + 1
while i < len(arr) and arr[i] == x:
indices.append(i)
i += 1
return sorted(indices)
# 示例
arr = [1, 2, 3, 4, 4, 4, 5, 6]
x = 4
print(find_indices(arr, x)) # [3, 4, 5]
上面的程序中,binary_search
函数使用递归实现了二分查找算法,它接受一个排序后的数组arr
、查找区间的左端点left
、右端点right
和要查找的元素x
,返回元素x
在数组中对应的索引。当arr[mid] == x
时算法结束,返回mid
;若arr[mid] > x
,说明x
在arr[left:mid]
区间内,递归查找该区间;否则x
在arr[mid+1:right]
区间内,递归查找该区间。当right < left
时,说明查找失败,返回-1。
find_indices
函数调用了binary_search
函数先找到元素x
在数组中的一个索引。然后,它使用两个循环向左和向右搜索,收集所有相同元素的索引,同时添加到indices
列表。最后,find_indices
函数返回排序后的indices
列表。
以上是以Python语言为例,介绍了在排序后的数组中查找给定元素的全部索引的实现方法。