#include <iostream>
#include <cstdio>
using namespace std;
int binary_serach(int [], int , int );
int lower_bound(int [], int , int );
int upper_bound(int [], int , int );
int find_miss_NO(int [], int);
int main()
{
/*
给定有序整数数组a[]和整数x,返回x在数组a[]中出现次数
【解题思路】
两次二分查找,分别求出upper_bound(x)和lower_bound(x),返回两者之差即可
*/
int a[10] = {1, 2, 3, 4, 4, 4, 5, 6, 6, 7};
cout << upper_bound(a, 10, 4) - lower_bound(a, 10, 4) << endl;
/*
一个sorted interger Array[1...N], 已知范围 1...N+1. 已知一个数字missing。 找该数字。比如
Array[]={1, 2, 3, 5, 6},则missing的数为4。
【解题思路】
典型的二分查找,如果Array[i]=i,则向右查找,否则向左查找。如果采用C++实现,由于下标从0开始,则需作适当修改。
*/
int b[] = {1, 2, 3, 4, 6};
cout << find_miss_NO(b, 5) << endl;
return 0;
}
int binary_serach(int a[], int n, int x)
{//找到x在a[]中的位置,不存在返回-1
int low = 0, high = n - 1, mid;
while(high >= low)
{
mid = low + ((high - low) >> 1);//防止溢出
if(a[mid] == x)
return mid;
else if(a[mid] < x)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
int lower_bound(int a[], int n ,int x)
{//lower_bound,即下界,找到大于等于x的第一个元素
int low = 0, high = n - 1, mid;
while(low <= high)
{
mid = low + ((high - low) >> 1);//防止溢出
if(a[mid] >= x)
high = mid - 1;
else
low = mid + 1;
}
return low;
}
int upper_bound(int a[], int n, int x)
{//upper_bound, 上界,找到大于x的第一个元素
int low = 0, high = n - 1, mid;
while(low <= high)
{
mid = low + ((high - low) >> 1);//防止溢出
if(a[mid] > x)
high = mid - 1;
else
low = mid + 1;
}
return low;
}
int find_miss_NO(int a[], int n)
{
/*
一个sorted interger Array[1...N], 已知范围 1...N+1. 已知一个数字missing。 找该数字。比如
Array[]={1, 2, 3, 5, 6},则missing的数为4。
【解题思路】
典型的二分查找,如果Array[i]=i,则向右查找,否则向左查找。如果采用C++实现,由于下标从0开始,则需作适当修改。
*/
int low = 0, high = n - 1, mid;
while(low <= high)
{
mid = low + ((high - low) >> 1);
if(a[mid - 1] == mid)
low = mid + 1;
else
high = mid - 1;
}
return low;
}
数组与二分查找
最新推荐文章于 2022-02-25 00:49:01 发布