Demo
约定,数组边界使用 [ , )
形式。
class Solution {
public:
int LeftBound(const vector<int>& arr, int tgt) {
int left = 0;
int right = arr.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] == tgt) {
right = mid;
} else if (arr[mid] > tgt) {
right = mid;
} else if (arr[mid] < tgt) {
left = mid + 1;
}
}
return left;
}
int RightBound(const vector<int>& arr, int tgt) {
int left = 0;
int right = arr.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] <= tgt) {
left = mid + 1;
} else {
right = mid;
}
}
return left - 1;
}
};
int main() {
Solution solution;
cout << "LeftBound\n";
// the return bound value must be valid for corresponding side!
// left bound means number in that position <= tgt number
// left side is always valid
cout << solution.LeftBound({1, 2, 3, 4, 5}, 3) << endl;
cout << solution.LeftBound({1, 2, 3, 4, 5}, 5) << endl;
cout << solution.LeftBound({1, 2, 3, 4, 5}, 1) << endl;
cout << solution.LeftBound({1, 2, 3, 4, 5}, 0) << endl;
cout << solution.LeftBound({1, 2, 2, 2, 5}, 5) << endl;
cout << solution.LeftBound({1, 2, 2, 2, 5}, 2) << endl;
cout << solution.LeftBound({1, 2, 2, 2, 5}, 6) << endl;
// output in [left, right)
// right bound means number int that position >= tgt number
// right side is always valid.
cout << "RightBound\n";
cout << solution.RightBound({1, 2, 3, 4, 5}, 3) << endl;
cout << solution.RightBound({1, 2, 3, 4, 5}, 5) << endl;
cout << solution.RightBound({1, 2, 3, 4, 5}, 1) << endl;
cout << solution.RightBound({1, 2, 3, 4, 5}, 0) << endl;
cout << solution.RightBound({1, 2, 2, 2, 5}, 5) << endl;
cout << solution.RightBound({1, 2, 2, 2, 5}, 2) << endl;
cout << solution.RightBound({1, 2, 2, 2, 5}, 6) << endl;
// output in (left, right]
return 0;
}