一个二分查找的基本题,不同的是需要寻找范围。那么就是要找第一个符合的最小的数,最后一个符合的最大的数。这样可以通过返回下标直接相减加一得到数量。在寻找最大的数的最大下标的时候需要mid = (l+r+1)/2。因为如果相等会让l = mid。但(l+r)/2会偏向于l处。在相邻的时候会出现不变的情况导致死循环。
细节:需要判断是否与题中所给区间有无交际,如果没有的话直接输出0,否则再使用查找函数去查找的话会找到第一位和最后一位停止的,返回的结果不对。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int n;
int find_min(int x) {
int l = 1, r = n;
int mid;
while (l<r) {
mid = (l+r)/2;
if (a[mid]>=x) r = mid;
else l = mid+1;
}
return l;
}
int find_max(int x) {
int l = 1, r = n;
int mid;
while (l<r) {
mid = (l+r+1)/2;
if (a[mid]<=x) l = mid;
else r = mid-1;
}
return l;
}
int main() {
cin>>n;
for (int i=1;i<=n;i++) {
cin>>a[i];
}
sort(a+1, a+n+1);
int q;
int x, y;
cin>>q;
while (q--) {
scanf("%d %d", &x, &y);
if (x>a[n]||y<a[1]) {
printf("0\n");
continue;
}
int begin = find_min(x);
int end = find_max(y);
// if (min_flag==0&&max_flag==0) {
// printf("0\n");
// continue;
// }
printf("%d\n", end-begin+1);
}
return 0;
}

京公网安备 11010502036488号