利用二分查找搜寻所有待查找数据pta
时间: 2025-07-05 12:07:13 浏览: 0
### 如何在 PTA 平台上用二分查找算法实现搜索所有待查找的数据
为了实现在有序数列中通过二分查找定位特定值并记录其位置的功能,可以采用如下方法:
#### 实现思路
当目标是在一个已知大小且预先排序好的列表里寻找某个数值的所有实例时,可以通过调整标准的二分查找逻辑来达成目的。具体来说,在找到第一个匹配项之后继续向左和向右探索相邻区域内的其他可能存在的相同元素。
#### Python代码示例
下面是一个Python版本的例子,展示了如何修改传统的二分查找过程以便能够返回所有的索引位置而不是仅仅停止于首次命中:
```python
def binary_search_all(nums, target):
result = []
def search_range(start, end):
nonlocal result
if start > end:
return
mid = (start + end) // 2
if nums[mid] == target:
# 找到目标后,不仅保存当前索引,
# 还需检查左右两侧是否有更多相同的值
temp_index = mid - 1
while temp_index >= start and nums[temp_index] == target:
result.append(temp_index)
temp_index -= 1
result.append(mid)
temp_index = mid + 1
while temp_index <= end and nums[temp_index] == target:
result.append(temp_index)
temp_index += 1
# 继续缩小范围进行更细致的搜索
search_range(start, mid - 1)
search_range(mid + 1, end)
elif nums[mid] < target:
search_range(mid + 1, end)
else:
search_range(start, mid - 1)
search_range(0, len(nums)-1)
return sorted(result)
if __name__ == "__main__":
N = int(input().strip())
arr = list(map(int, input().strip().split()))
y = int(input().strip())
indices = binary_search_all(arr, y)
if not indices:
print("not found")
else:
print(len(indices))
for index in indices:
print(index, end=' ')
```
此程序首先定义了一个辅助函数`search_range()`用于递归地执行二分查找,并在其内部处理重复出现的目标值的情况。一旦发现等于给定键值的关键字,则会向前向后扫描直到不再遇到相等关键字为止。最后按照题目要求输出结果[^4]。
阅读全文
相关推荐


















