刷题笔记:洛谷P2249 【深基13.例1】查找 (Java)

输入:

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;
	}
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z菌君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值