在一个上升序列中,查找刚刚小于给定值k的元素。如样例1:2 5 6 8 9 中刚刚比7小的数是6(数据保证存在) 输入 第一行包含一个整数n,为上升序列长度。1 ≤ n ≤ 100000。 第二行包含n个整数,为上升序各元素。所有元素的大小均在0-1,000,000,000之间。 第三行包含一个整数m,为要询问的次数。1 ≤ m ≤ 10000。 接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。 输出 m行,每行一个整数,为刚刚小于给定值k的元素。
时间: 2024-02-15 17:01:36 浏览: 96
十大算法之线性查找算法
好的,这个问题可以使用二分查找算法来解决。具体步骤如下:
1. 读入序列长度 n 和序列元素 a1, a2, ..., an。
2. 对序列 a 进行排序,使其成为一个上升序列。
3. 读入询问次数 m,并依次读入每个要询问的值 k。
4. 对于每个询问的值 k,使用二分查找算法在序列 a 中找到刚好小于 k 的元素。具体做法是:
- 初始化左右指针 l 和 r,分别指向序列的第一个和最后一个元素。
- 当 l <= r 时,执行以下操作:
- 计算中间位置 mid = (l + r) / 2。
- 如果 a[mid] < k,说明要查找的元素在右半部分,令 l = mid + 1。
- 如果 a[mid] >= k,说明要查找的元素在左半部分或者当前位置,令 r = mid - 1。
- 最终,l 指向的就是刚好小于 k 的元素。
5. 输出每个询问的答案。
以下是使用 Python 语言实现的代码示例:
```python
n = int(input())
a = list(map(int, input().split()))
a.sort() # 排序
m = int(input())
for i in range(m):
k = int(input())
l, r = 0, n - 1 # 初始化左右指针
while l <= r:
mid = (l + r) // 2
if a[mid] < k:
l = mid + 1
else:
r = mid - 1
print(a[r]) # 输出答案
```
阅读全文