开区间写法
int find1(int q) {//后继
//开区间
int l = -1, r = n;
while (l + 1 < r) {
int mid = l + r >> 1;
if (a[mid] <= q)l = mid;
else r = mid;
}
return l;
}
int find2(int q) { //前区 可以直接 q+1就边后继了
int l = -1, r = n;
while (l + 1 < r) {
int mid = l + r >> 1;
if (a[mid] >= q)r = mid;
else l = mid;
}
return r;
}
闭区间写法
int find3(int q) {
//闭区间写法
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (a[mid] <= q) l = mid;
else r = mid - 1;
}
return l;
}
int find4(int q) {
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r>>1;
if (a[mid] >= q)r = mid;
else l = mid+1;
}
return r;
}
ans 记录的等号
int find5(int q) {
//闭区间
int ans = 0;
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + r >> 1;
if (a[mid] <= q) {
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
return ans;
}
int find6(int q) {
int ans = 0;
int l = 0, r = n - 1;
while (l <= r) { // l = r + 1结束
int mid = l + r >> 1;
if (a[mid] >= q) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
return ans;
}
全部代码
#include<iostream>
using namespace std;
int a[1000]={1,2,3,4,5,5,6,7,9}, n = 9;
int find1(int q) {//后继
//开区间
int l = -1, r = n;
while (l + 1 < r) {
int mid = l + r >> 1;
if (a[mid] <= q)l = mid;
else r = mid;
}
return l;
}
int find2(int q) { //前区 可以直接 q+1就边后继了
int l = -1, r = n;
while (l + 1 < r) {
int mid = l + r >> 1;
if (a[mid] >= q)r = mid;
else l = mid;
}
return r;
}
int find3(int q) {
//闭区间写法
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (a[mid] <= q) l = mid;
else r = mid - 1;
}
return l;
}
int find4(int q) {
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r>>1;
if (a[mid] >= q)r = mid;
else l = mid+1;
}
return r;
}
int find5(int q) {
//闭区间
int ans = 0;
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + r >> 1;
if (a[mid] <= q) {
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
return ans;
}
int find6(int q) {
int ans = 0;
int l = 0, r = n - 1;
while (l <= r) { // l = r + 1结束
int mid = l + r >> 1;
if (a[mid] >= q) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
return ans;
}
int main() {
cout << find1(5)<<endl;//后继 为 5
cout << find2(5)<<endl;//前驱 为4
cout << find2(6)-1 << endl;//函数加1 ,外减-1就是后继
return 0;
}