14.二分
#include<stdio.h>
int a[100000];
int main(){
int n;
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int m;
scanf("%d",&m);
int l=0;//l从0开始
int r=n-1;//r从n-1;
int mid;
while(l<=r){
mid=(l+r)/2;
if(a[mid]==m) break;
if(a[mid]>m) l=mid+1;//+1
else r=mid-1;//-1
}
printf("%d ",mid+1);
return 0;
}
15.查找第一个等于或者大于key的元素
查找第一个等于或者大于key的元素,也就是说等于查找key值的元素有好多个,返回这些元素最左边的元素下标;如果没有等于key值的元素,则返回大于key的最左边元素下标。
#include<stdio.h>
int seach(int key){
int l=0;
int r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]>=key)
r=mid-1;
else l=mid+1;
}
return l;
}
16.查找第一个大于key的元素
查找第一个等于key的元素,也就是说返回大于key的最左边元素下标。
#include<stdio.h>
int seach(int key){
int l=0;
int r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]>key)
r=mid-1;
else l=mid+1;
}
return l;
}
17.查找最后一个小于key的元素
查找最后一个小于key的元素,也就是说返回小于key的最右边元素下标。
#include<stdio.h>
int seach(int key){
int l=0;
int r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]>=key)
r=mid-1;
else l=mid+1;
}
return r;
}
18.查找最后一个等于或者小于key的元素
查找最后一个等于或者小于key的元素,也就是说等于查找key值的元素有好多个,返回这些元素最右边的元素下标;如果没有等于key值的元素,则返回小于key的最右边元素下标。
#include<stdio.h>
int seach(int key){
int l=0;
int r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]>key)
r=mid-1;
else l=mid+1;
}
return r;
}
19.查找最后一个与key相等的元素
查找最后一个相等的元素,也就是说等于查找key值的元素有好多个,返回这些元素最右边的元素下标。
#include<stdio.h>
int seach(int key){
int l=0;
int r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]<=key)
r=mid-1;
else l=mid+1;
}
if (r >= 0 && a[r] == key) {
return r;
}
return -1;
}
20.查找第一个与key相等的元素
查找第一个相等的元素,也就是说等于查找key值的元素有好多个,返回这些元素最左边的元素下标。
#include<stdio.h>
int seach(int key){
int l=0;
int r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]>=key)
r=mid-1;
else l=mid+1;
}
if (left < n && a[l] == key) {
return l;
}
return -1;
}