二分
思想很容易理解,但是写起来可能就会出现很多问题,下面给出一套完整的模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <bits/stdc++.h> using namespace std;
int n; vector<int> nums;
int my_upper_bound(int target) { int l = -1; int r = n; while (l + 1 != r) { int mid = (l + r) / 2; if (nums[mid] <= target) { l = mid; } else { r = mid; } } return l; }
int my_lower_bound(int target) { int l = -1; int r = n; while (l + 1 != r) { int mid = (l + r) / 2; if (nums[mid] >= target) { r = mid; } else { l = mid; } } return r; }
int main() { nums = {1, 3, 3, 5, 7, 9, 9, 9, 15}; n = nums.size();
int target = 9; int lo = my_lower_bound(target); int up = my_upper_bound(target);
cout << "Target: " << target << endl; cout << "Lower bound index: " << lo << ", Value: " << (lo < n ? nums[lo] : -1) << endl; cout << "Upper bound index: " << up << ", Value: " << (up >= 0 ? nums[up] : -1) << endl;
return 0; }
|