java-二分查找练习题(简单项)

这篇博客介绍了如何使用二分查找算法解决两种问题:1. 在有序整数数组中查找元素的起始和终止位置;2. 计算正浮点数的平方根。通过Java代码示例展示了整数二分查找和浮点数二分查找的实现细节,并提供了输入输出示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近时间有点紧o(╥﹏╥)o,没有时间进行过多的说明,有时间了再补起来,先把学习的东西记录一下,本文仅供个人学习使用,作为学习记录激励自己,当然也希望能在一定程度上帮到其他人,如果有错误还望批评指正。

1.整数二分

题目:
        给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
        对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。
        如果数组中不存在该元素,则返回 -1 -1。

        输入格式
            第一行包含整数 n 和 q,表示数组长度和询问个数。
            第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。
            接下来 q 行,每行包含一个整数 k,表示一个询问元素。

        输出格式
            共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。
            如果数组中不存在该元素,则返回 -1 -1。

        数据范围
            1≤n≤100000
            1≤q≤10000
            1≤k≤10000
        输入样例:
            6 3
            1 2 2 3 3 4
            3
            4
            5
        输出样例:
            3 4
            5 5
            -1 -1

java代码:

public class IntegerDichotomy {
    public static void main(String[] args) {
        //输入控制
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int q = sc.nextInt();
        for (int i = 0;i<n;i++) arr[i] = sc.nextInt();
        //定义指针,x为题目中的k,l为每次循环的左边界(left),r为每次循环的右边界(right),mid为中间指针
        int x, l,r,mid;
        
        while (q>0){
            //每次循环开始初始化指针
            l = 0;
            r = n-1;
            q--;
            x = sc.nextInt();
            //二分确定最终元素所在的左边界
            while (l<r){
                mid = l+r>>1;
                if(arr[mid]>=x) r = mid;
                else l = mid+1;
            }
            // 如果元素不存在
            if (arr[l]!=x) System.out.println("-1 -1");
            else {      //如果元素存在确定了左边界,然后在确定右边界
                System.out.print(l+" ");
                l = 0;
                r = n-1;
                while (l<r){
                    mid = l+r+1 >> 1;
                    if (arr[mid]<=x) l = mid;
                    else r = mid-1;
                }
                System.out.println(l);
            }
        }

    }
}

2.浮点二分

题目:
	输入一个正浮点数,要求输出这个数的平方根

Java代码:

public class DoubleDichotomy {
    public static void main(String[] args) {
        //输入控制,可以选择BufferedReader
        Scanner sc = new Scanner(System.in);
        double x = sc.nextDouble();
        //指针定义,说明同整数二分
        double l = 0, r = x, mid;
        //浮点二分
        //le-8是精度确定,可以自行定义。
        while (r-l>1e-8){
            mid = (l+r)/2;
            if (mid*mid>x) r = mid;
            else l = mid;
        }
        System.out.println(l);
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值