基础版本
1bool binarySearch(vector<int> &scores, int target)
2{
3 int l = 0, r = scores.size() - 1;
4 while (l <= r) {
5 int mid = l + (r - l) / 2;
6
7 if (scores[mid] == target) {
8 return true;
9 }
10
11 if (scores[mid] < target) {
12 l = mid + 1;
13 }
14 else {
15 r = mid - 1;
16 }
17 }
18 return false;
19}
lower_bound 和 upper_bound
1// lower_bound: 返回第一个大于等于 target 的元素的迭代器
2int lower_bound(vector<int> &scores, int target)
3{
4 int l = 0, r = scores.size() - 1;
5 while (l <= r) {
6 int mid = l + (r - l) / 2;
7
8 if (scores[mid] < target) {
9 l = mid + 1;
10 }
11 else {
12 r = mid - 1;
13 }
14 }
15 return l; // 返回第一个大于等于 target 的位置
16}
17// upper_bound: 返回第一个大于 target 的元素的迭代器
1class Solution {
2public:
3 int countTarget(vector<int> &scores, int target)
4 {
5 int lb = scores.size(), ub = scores.size();
6
7 int l = 0, r = scores.size() - 1;
8 while (l <= r) {
9 int mid = l + (r - l) / 2;
10
11 if (scores[mid] < target) {
12 l = mid + 1;
13 }
14 else {
15 lb = mid;
16 r = mid - 1;
17 }
18 }
19
20 l = 0, r = scores.size() - 1;
21 while (l <= r) {
22 int mid = l + (r - l) / 2;
23
24 if (scores[mid] <= target) {
25 l = mid + 1;
26 }
27 else {
28 ub = mid;
29 r = mid - 1;
30 }
31 }
32 return ub - lb;
33 }
34};