算法日记(一)_m0_61723200的博客-CSDN博客
之前在这篇文章用的是自定义函数的方法进行二分查找的,今天我会用stl函数进行二分查找.
binary_search:查找某个元素是否出现,返回bool型。
lower_bound:查找第一个大于或等于某个元素的位置。
upper_bound:查找第一个大于某个元素的位置。
先看道二分查找的题
Description
给你一个长度为n的排列有序从小到大递增的数组, 还有q次查询, 询问一个数字在这个数组中出现的位置.
Input
第1行输入一个正整数n (1<=n<=10000001<=n<=1000000), 代表数组的长度.
第2行输入n个整数, 从小到大递增, 均在Int类型范围内, 且不重复.
第3行输入一个正整数q (1<=q<=100001<=q<=10000), 代表欲查询的次数.
第4行到第q+3行输入一个正整数, 代表欲查询的数字.
你可以认为所有输入数据均为合法输入.
Output
每行输出一个数字.
若存在这个数, 则输出对应数组位置的下标(从0开始).
若不存在这个数, 则输出-1.
Sample Input 1
5 1 3 5 7 9 3 1 7 2
Sample Output 1
0 3 -1
Hint
请不要尝试暴力查询.
首先,先看一下不用stl函数的解法
#include
using namespace std;
int twofen(int a[],int x,int n);
int main()
{
int n,x,q;
scanf("%d",&n);//数组长度
int a[n];
for(int i=0;ia[middle])//如果大了
{
left=middle+1;//说明在右区间
}
else
{
right=middle-1;//小了,在左区间
}
}
return -1;//没找到返回-1
}
再看看stl库函数的二分法
#include
using namespace std;
int main()
{
int M,a[200005],n,x;
scanf("%d",&M);//输入的数组元素个数
for(int i=0;i
Description
给你一个长度为n的排列有序从小到大递增的数组, 还有q次查询, 现在希望将一个数字插入数组之中, 但是不破坏数组原来从小到大递增的性质, 想让你写个程序帮忙找插入的位置(只寻找, 并不会插入改变原数组).
Input
第1行输入一个正整数n (1<=n<=10000001<=n<=1000000), 代表数组的长度.
第2行输入n个整数, 从小到大递增, 均在Int类型范围内, 可能会重复.
第3行输入一个正整数q (1<=q<=100001<=q<=10000), 代表欲查询的次数.
第4行到第q+3行输入一个正整数, 代表欲插入的数字.
你可以认为所有输入数据均为合法输入.
Output
每行输出一个数字.
输出对应数组位置的下标(从0开始), 即插入该数字之后该数字的数组下标.
Sample Input 1
5 4 10 70 96 100 3 3 9 111
Sample Output 1
0 1 5
还是先看不用stl库函数的方法
#include
using namespace std;
int n,q,x;
int main()
{
cin>>n;
int a[n];
for(int i=0;i>a[i];
}
cin>>q;
for(int i=1;i<=q;i++)//这属于模板二,可以看上面附的博客
{
cin>>x;//要找的数
int l=0,r=n;
while(l>1;//位运算除2
if(a[mid]>=x)//如果大于等于要找的数
r=mid;//说明在左边
else
l=mid+1;//否则在右边
}
cout<
stl函数做法
#include
using namespace std;
int main()
{
int M,a[1000005]={0},n,x;
scanf("%d",&M);//输入的数组元素个数
for(int i=0;i=0){
//if(p==1) ///数组中无重复数字x的情况
printf("%d",k-a);
//else ///数组中有重复数字x的情况
//for(int w=k-a;w