Skip to main content

789.数的范围

思路

因为题目已经给出数组升序,所以直接使用二分,只要找到对应的左边界和有边界即可找到对应数的范围。所以使用一次二分找到左边界,再使用一次找到右边界。

  • 要注意 mid 是否需要加 1,以及 l 和 r 的边界。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

int n, q;
int a[N];

int main() {
cin >> n >> q;

for (int i = 0; i < n; i++) cin >> a[i];

while (q --) {
int k;
cin >> k;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (a[mid] >= k) r = mid;
else l = mid + 1;
}
if (a[l] != k) cout << "-1 -1" << endl;
else {
cout << l << " ";

int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (a[mid] <= k) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}

return 0;
}