输入:
11 3 1 3 3 3 5 7 9 11 13 15 15 1 3 6
输出:
1 2 -1
基础二分查找题,但是也要注意3个点:
1,Java没有算法库,需要手写二分.
2 ,输入输出次数过多,不能用Scanner类来读取,读取的太慢了会导致超时并且内存超限,应该要用快读快输,不过这道题不要快输也行,所以必须记住快读数字,快读字符串,和快输的模板。
3, 看清题目要求,要求找到该数字第一次出现的位置 ,所以不能在找到目标后就往前遍历,这样的话有特殊数据会导致超时,比如 1 2 2 2 2 2 2 2 2 2 2,这个数组中查找数字2第一次出现的下标时,时间复杂度便为O(n*m)。
以下是AC代码,可以记住该二分模板,可以实现查找某个数字第一次出现的位置下标。
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Scanner;
public class Main {
static int num[];
public static void main(String[] args) throws Exception{
Read sc=new Read();
int n=sc.nextInt();
int m=sc.nextInt();
num=new int[n];
for(int i=0;i<n;i++) {
num[i]=sc.nextInt();
}
while(m-->0) {
int target=sc.nextInt();
int left=0;
int right=n-1;
while(left<right) {//二分模板
int mid=(left+right)/2;
if(num[mid]<target) {
left=mid+1;
}
else if(num[mid]>=target) {
right=mid;
}
}
if(num[left]==target)
System.out.print((left+1)+" ");
else {
System.out.print("-1 ");
}
}
}
}
//快读
class Read{
StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public int nextInt() throws Exception{
st.nextToken();
return (int)st.nval;
}
}