// 二分查找,返回和目标相等的元素下标
int binary_find(std::vector<int>& vec, int target) {
int left = 0;
int right = vec.size()-1;
while(left<=right){
// 若 left+right超出int范围
// int mid = (left+right)/2;
int mid = left + (right-left)/2;
if (vec[mid] < target) left = mid+1;
else if (vec[mid] > target) right = mid-1;
else return mid;
}
return -1;
}
// 二分查找,数组中有会出现重复元素,返回最左边第一个和目标相同元素的下标
int binary_find(std::vector<int>& vec, int target) {
// 使用二分查找,加线程遍历
int left = 0;
int right = vec.size()-1;
int mid = 0;
while(left<=right){
mid = left + (right-left)/2;
if (vec[mid] < target) left = mid+1;
else if (vec[mid] > target) right = mid-1;
else {
break;
};
}
// 线性时间复杂度O(n)
for (int i = 0; i<=mid; i++) {
if (vec[i] == target) return i;
}
return -1;
}
// 二分法,数组中有会出现重复元素,返回最左边第一个和目标相同元素的下标
int binary_find(std::vector<int>& vec, int target) {
int left = 0;
int right = vec.size()-1;
int mid = 0;
while(left<=right){
mid = left + (right-left)/2;
if (vec[mid] < target) left = mid+1;
else if (vec[mid] > target) right = mid-1;
else {
right = mid -1; // 缩小右边边界,再次二分查找
};
}
// i == vec.size(); 数组为空
if (i == vec.size() || vec[i] != target) return -1;
return i; // i和j相等
}
二分查找法
最新推荐文章于 2023-12-01 13:49:20 发布