简单化写法解决二分
找到不小于某个值的最左边的数字
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int bfind(
vector<int>& data,
int target) { // 函数是在data中找到第一个不小于target的数,相当于lower_bound
int l = 0;
int r = data.size() - 1;
int res = -1;
// 所以这里维持着一个左闭右闭
while (l <= r) {
int mid = l + (r - l) / 2;
if (data[mid] < target) {
l = mid + 1;
} else if (data[mid] >= target) {
res = mid;
r = mid - 1;
}
}
return res;
}
int main() {
vector<int> data = {5, 8, 8, 8, 8, 9, 13};
cout << bfind(data, 8) << endl;
auto iter = lower_bound(data.begin(), data.end(), 8);
if (iter == data.end()) {
cout << "not find" << endl;
return 0;
}
cout << std::distance(data.begin(), iter) << endl;
cout << *iter << endl;
}
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int bfind(
vector<int>& data,
int target) { // 函数是在data中找到第一个不小于target的数,相当于lower_bound
int l = 0;
int r = data.size();
int res = -1;
// 所以这里维持着一个左闭右开
while (l < r) {
int mid = l + (r - l) / 2;
if (data[mid] < target) {
l = mid + 1;
} else if (data[mid] >= target) {
res = mid;
r = mid;
}
}
return res;
}
int main() {
vector<int> data = {5, 8, 8, 8, 8, 9, 13};
cout << bfind(data, 8) << endl;
auto iter = lower_bound(data.begin(), data.end(), 8);
if (iter == data.end()) {
cout << "not find" << endl;
return 0;
}
cout << std::distance(data.begin(), iter) << endl;
cout << *iter << endl;
}
找到等于某个值的最右边的数字
int bfind(
vector<int>& data,
int target) {
int l = 0;
int r = data.size();
int res = -1;
// 所以这里维持着一个左闭右开
while (l < r) {
int mid = l + (r - l) / 2;
if (data[mid] < target) {
l = mid + 1;
} else if (data[mid] == target) {
res = mid;
l = mid + 1;
}
if (data[mid] > target) {
r = mid;
}
}
return res;
}
简单点直接加一个res,这个res的好处在于能够返回没有找到的情况,如果直接返回r或者l是不能处理没找到的情况
int bfind(
vector<int>& data,
int target) {
int l = 0;
int r = data.size()-1;
int res = -1;
// 所以这里维持着一个左闭右闭
while (l <= r) {
int mid = l + (r - l) / 2;
if (data[mid] < target) {
l = mid + 1;
} else if (data[mid] == target) {
res = mid;
l = mid + 1;
}
if (data[mid] > target) {
r = mid-1;
}
}
return res;
}
博客内容展示了如何使用二分查找算法找到不小于目标值的最左边的数字,以及等于目标值的最右边的数字。通过两种不同实现方式,讨论了左闭右开和左闭右闭边界条件的影响,并提供了与标准库`lower_bound`函数的比较。

被折叠的 条评论
为什么被折叠?



