- 如:1,3,3,3,5,6,8,9
- 找左端点的3:
- mid = (right - left) / 2 + left;
- if(nums[mid] < key)
left = mid + 1;
else
right = mid;
- 找右端点的3:
- mid = (right - left) / 2 + left + 1;
- if(nums[mid] > key)
right = mid - 1;
else
left = mid;
#include <iostream>
#include <vector>
using namespace std;
int find_left(const vector<int>& nums, int left, int right, int key)
{
while(left < right)
{
int mid = (right - left) / 2 + left;
if(nums[mid] < key)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return nums[left] == key ? left : -1;
}
int find_right(const vector<int>& nums, int left, int right, int key)
{
while(left < right)
{
int mid = (right - left) / 2 + left + 1;
if(nums[mid] > key)
{
right = mid - 1;
}
else
{
left = mid;
}
}
return nums[left] == key ? left : -1;
}
int main()
{
int n, k;
cin >> n >> k;
vector<int> nums(n), qry(k);
for(int i = 0; i < n; i++)
cin >> nums[i];
for(int i = 0; i < k; i++)
cin >> qry[i];
for(auto &a : qry)
{
cout << find_left(nums, 0, n - 1, a) << " ";
cout << find_right(nums, 0, n - 1, a) << endl;
}
return 0;
}