一、问题描述
给定一个数组 vector arr1 = { 1,2,3,5,5,5,5,8,9 }:
- 1.寻找最后一个<5的数;
- 2.寻找第一个>=5的数;
- 3.寻找最后一个<=5的数;
- 4.寻找第一个>5的数。
二、寻找最后一个<5的数
int binaryS(vector<int> arr) {
//i*i=x 0-x
int l = 0, r = arr.size()-1;//确定搜索范围左闭右闭[0,arr.size()-1]
int index = 0;//建立一个返回点,便于判断
while (l <= r) {//统一
int mid = (l + r) / 2;
//最后一个<5的数,确定区间<5
if (arr[mid] < 5) {//循环结束后,index指向最后一个<5的数
index = mid;
l = mid+1;//不用判断区间,直接改变左边界
}
else {
r = mid-1 ;//不用判断区间,直接改变右边界
}
}
return index;
}
c++中对应算法:int arr1[]={ 1,2,3,5,5,5,5,8,9 };
std::lower_bound(arr1, arr1 + 8, 5) - arr1-1
三、寻找第一个>=5的数
int binaryS(vector<int> arr) {
//i*i=x 0-x
int l = 0, r = arr.size()-1;//确定搜索范围左闭右闭[0,arr.size()-1]
int index = 0;//建立一个返回点,便于判断
while (l <= r) {//统一
int mid = (l + r) / 2;
//第一个>=5的数,确定区间在最后一个<5数的右边
if (arr[mid] < 5) {//循环结束后,index指向最后一个<5的数
index = mid;
l = mid+1;//不用判断区间,直接改变左边界
}
else {
r = mid-1 ;//不用判断区间,直接改变右边界
}
}
return index+1;//返回最后一个<5的数+1即可
}
c++中对应算法:int arr1[]={ 1,2,3,5,5,5,5,8,9 };
std::lower_bound(arr1, arr1 + 8, 5) - arr1
四、寻找最后一个<=5的数
int binaryS(vector<int> arr) {
//i*i=x 0-x
int l = 0, r = arr.size()-1;//确定搜索范围左闭右闭[0,arr.size()-1]
int index = 0;//建立一个返回点,便于判断
while (l <= r) {//统一
int mid = (l + r) / 2;
//最后一个<=5的数,确定区间<=5
if (arr[mid] <= 5) {//循环结束后,index指向最后一个<=5的数
index = mid;
l = mid+1;//不用判断区间,直接改变左边界
}
else {
r = mid-1 ;//不用判断区间,直接改变右边界
}
}
return index;
}
c++中对应算法:std::upper_bound()-1
四、寻找第一个>5的数
int binaryS(vector<int> arr) {
//i*i=x 0-x
int l = 0, r = arr.size()-1;//确定搜索范围左闭右闭[0,arr.size()-1]
int index = 0;//建立一个返回点,便于判断
while (l <= r) {//统一
int mid = (l + r) / 2;
//最后一个>5的数,确定区间最后一个<=5的数+1
if (arr[mid] <= 5) {//循环结束后,index指向最后一个<=5的数
index = mid;
l = mid+1;//不用判断区间,直接改变左边界
}
else {
r = mid-1 ;//不用判断区间,直接改变右边界
}
}
return index+1;//返回最后一个<=5的数+1
}
c++中对应算法:std::upper_bound()