二分查找函数:
public static void midsearch(int k) {
int l=0,h=m-1;
while(l<h) {
int mid = (l+h)/2;
if(a[mid]==k) {
flag=true;
System.out.println(mid);
return;
}
else if(a[mid]>k) {
h = mid-1;}
else l=mid+1;
}
if(flag==false) {
System.out.println("数组中没有这个数");
}
}
二分查找一个大于等于X的最小值
public static int FindH(int k) {
//二分查找一个大于等于k的最小值
int l=0,h=m-1;
while(l<h) {
int mid = (1+l+h)/2; //如果找的数位于第二位时,会造成死循环,因此需要1+l+h
if(a[mid]>k) {
h = mid-1;
}
else l = mid;
}
return l;
}
二分查找一个小于等于X的最小值
public static int FindL(int k) {
//二分查找一个小于等于k的最小值
int l=0,h=m-1;
while(l<h) {
int mid = (l+h)/2;
if(a[mid]<k) {
l=mid+1;
}
else h=mid;
}
return l;
}
例题:
源代码:
package Three;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public static int FindL(int k) {
//二分查找一个小于等于k的最小值
int l=0,h=m-1;
while(l<h) {
int mid = (l+h)/2;
if(a[mid]<k) {
l=mid+1;
}
else h=mid;
}
return l;
}
public static int FindH(int k) {
//二分查找一个大于等于k的最小值
int l=0,h=m-1;
while(l<h) {
int mid = (1+l+h)/2; //如果找的数位于第二位时,会造成死循环,因此需要1+l+h
if(a[mid]>k) {
h = mid-1;
}
else l = mid;
}
return l;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
m = in.nextInt();
int n = in.nextInt();
for(int i=0;i<m;i++)
a[i] = in.nextInt();
for(int j=0;j<n;j++)
b[j]=in.nextInt();
for(int z=0;z<n;z++) {
int l = FindL(b[z]);
int h = FindH(b[z]);
if(a[l]==b[z]) System.out.println(l+" "+h);
else System.out.println("-1 -1");
}
}
}
2020.11.10–22.16