一.二分查找
int binarySearch(vector<int>& arr, int target) {
int left = 0;
int right = int(arr.size()) - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
// 根据题意补充代码
return mid;
}
if (arr[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
// left 是插入点
return left;
}
二.二分查找(有重复值最左边)
#include <iostream>
#include <vector>
bool fun1(int x) {
// 示例条件,可以根据实际需求修改
return x <= 6;
}
int findLastTrue(const std::vector<int>& arr) {
int left = 0;
int right = arr.size() - 1;
int result = -1; // 用于存储最后一个满足条件的元素下标
while (left <= right) {
int mid = left + (right - left) / 2;
if (fun1(arr[mid])) {
result = mid; // 记录当前满足条件的位置
left = mid + 1; // 继续搜索右半部分
} else {
right = mid - 1; // 搜索左半部分
}
}
return result; // 返回最后一个满足条件的元素下标
}
int main() {
std::vector<int> arr = {1, 2, 3, 5, 5, 5, 7, 8, 9};
int index = findLastTrue(arr);
if (index != -1) {
std::cout << "最后一个满足 fun1(x) 为 true 的元素在下标: " << index << ", 值为: " << arr[index] << std::endl;
} else {
std::cout << "没有找到满足条件的元素。" << std::endl;
}
return 0;
}
三.二分查找(有重复值最右边)
#include <iostream>
#include <vector>
bool fun1(int x) {
// 示例条件,可以根据实际需求修改
return x >= 4;
}
int findFirstTrue(const std::vector<int>& arr) {
int left = 0;
int right = arr.size() - 1;
int result = -1; // 用于存储最后一个满足条件的元素下标
while (left <= right) {
int mid = left + (right - left) / 2;
if (fun1(arr[mid])) {
result = mid; // 记录当前满足条件的位置
right = mid - 1;
// 继续搜索左半部分
} else {
left = mid + 1;// 搜索右半部分
}
}
return result; // 返回最后一个满足条件的元素下标
}
int main() {
std::vector<int> arr = {1, 2, 3, 5, 5, 5, 7, 8, 9};
int index = findFirstTrue(arr);
if (index != -1) {
std::cout << "最后一个满足 fun1(x) 为 true 的元素在下标: " << index << ", 值为: " << arr[index] << std::endl;
} else {
std::cout << "没有找到满足条件的元素。" << std::endl;
}
return 0;
}