版权声明:希望大家读懂代码,而不是复制粘贴提交 https://blog.csdn.net/pythonbanana/article/details/82529728
现在讨论二分搜索时的边界问题.
首先是第一个模板:
int binarySearch(int key){
int left = 0,right = n;
while(left < right){//这里是<,与下面的r = mid,l = mid+1,和数组从0->n-1
//还有l,r的初始值l = 0,r = n,这些是一一对应的
int mid = (right - left) / 2;
if(A[mid] == key){
return mid;
}else if(key < A[mid]){
right = mid;
}else{
left = mid + 1;
}
}
return NOT_FOUND;
}
第二个模板是
int binarySearch(int key){
int left = 1,right = n;
while(left <= right){//这里是<=,与下面的r = mid - 1,l = mid+1,和数组从1->n
//还有l,r的初始值l = 1,r = n,这些是一一对应的
int mid = (right - left) / 2;
if(A[mid] == key){
return mid;
}else if(key < A[mid]){
right = mid + 1;
}else{
left = mid + 1;
}
}
return NOT_FOUND;
}
lower_bound的实现:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 100;
int a[maxn];
int n = 0;
int solve(int x){
int l = 1,r = n,mid = 0;
int loc = 0;
while(l <= r){//这里用<=与下面的r = mid-1,l = mid+1,和a[]数组下标从1->n是意义对应的
mid = (r - l)/2 + l;
if(a[mid] == x){
loc = mid;
r = mid - 1;
}else if(a[mid] < x){
loc = mid;
l = mid + 1;
}else{
r = mid - 1;
}
}
//if(loc == 0){
// return a[mid] < x ?
// return l - 1;
// }
cout << "en " << l << " " << mid << " " << r << endl;
if(a[mid] == x){
return loc;
}else if(a[mid] < x){
return l - 1;
}else{
return r + 1;
}
// return a[mid] <= x ?
// return loc;
}
int main(){
while(cin >> n){
for(int i = 1;i <= n;++i){//注意是从1->n
cin >> a[i];
}
sort(a + 1,a + n + 1);
int key = 0;
while(cin >> key){
cout << solve(key)<< endl;
}
}
return 0;
}