请实现有重复数字的有序数组的二分查找。 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 输入格式: 输入第一行有两个数,第一个数为数组长度n(≤10^6),第二个数为需要查找的数。 接下来有n个整数,以空格或换行符分隔。 输出格式: 输出待查找的数的位置。 输入样例: 5 4 1 2 4 4 5 输出样例: 3 样例解释: 有5个数,查找4出现的位置,4第一次出现在第3个位置,所以输出3。
时间: 2024-03-17 17:41:21 浏览: 47
以下是C++的实现代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, target;
cin >> n >> target;
vector<int> nums(n);
for (int i = 0; i < n; i++)
cin >> nums[i];
int left = 0, right = n - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (nums[mid] >= target)
right = mid - 1;
else
left = mid + 1;
}
if (left < n && nums[left] == target)
cout << left << endl;
else
cout << n + 1 << endl;
return 0;
}
```
算法思路:
1. 用 left 和 right 分别表示数组的左右两个端点。
2. 在 while 循环中,每次找到中间位置 mid,将 mid 位置的数与 target 比较。
3. 如果 nums[mid] >= target,说明 target 可能出现在左侧,令 right = mid - 1。
4. 如果 nums[mid] < target,说明 target 可能出现在右侧,令 left = mid + 1。
5. 如果 left < n 且 nums[left] == target,说明找到了 target 的第一个位置,输出 left。
6. 如果 left >= n 或 nums[left] != target,说明数组中不存在 target,输出 n + 1。
阅读全文