备战蓝桥杯,用JAVA刷洛谷算法题单:【算法1-6】二分查找与二分答案

本文介绍了如何在Java中优化二分查找算法,包括使用StreamTokenizer和PrintWriter进行快速输入输出,以及在P1102A-B和P1873等具体题目中的应用实例。还提及了一元三次方程求解和高精度计算的方法。

参考

【算法1-6】二分查找与二分答案 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

image-20240306094811081

模板

感谢锋哥给我的模板,不用再被边界和while条件以及最后到底取哪个值发愁了;

  • 添加一个ans变量,l和r初始化为有值的边界下标,while条件为l<=r,最后取得的结果就是ans。
  • 针对题目问题做判断,对于符合条件的要给ans赋值。
  • 例如升序求第一个大于k的那就继续往左找(你想,找到了一个符合这个条件的,但是因为升序,则左边可能还有大于k的),此时r=mid-1

详细代码可见二分查找专题代码.pdf

题目

P2249 【深基13.例1】查找

几个MLE?

package _1_6;

import java.util.Scanner;

public class P2249 {
   
   

    private static int n;
    private static int m;
    private static int[] nums;
    private static int[] ks;

    public static void main(String[] args) {
   
   
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        nums = new int[n + 1];
        ks = new int[m];
        for (int i = 1; i <= n; i++) {
   
   
            nums[i] = scanner.nextInt();
        }
        for (int i = 0; i < m; i++) {
   
   
            ks[i] = scanner.nextInt();
        }
        for (int i = 0; i < m; i++) {
   
   
            int res = biSearch(ks[i]);
            System.out.printf("%d ", res);
        }
        scanner.close();
    }

    public static int biSearch(int k) {
   
   
        int l = 1, r = n;
        int ans = -1;
        while (l <= r) {
   
   
            int m = l + (r - l) / 2;
            if (nums[m] == k) {
   
   
                ans = m;
                r = m - 1;
            } else if (nums[m] < k) {
   
   
                l = m + 1;
            } else {
   
   
                r = m - 1;
            }
        }
        return ans;
    }
}

修改后:使用快速输入输出(别用Scanner和sout了!!!都给我用StreamTokenizer和PrintWriter)看看这前后差距

Java基础之快速输出输入篇_java快速输入-优快云博客

java快速输入输出 - Kitorio - 博客园 (cnblogs.com)

fc929de58151181250273ecb1c4a16d1

41d88706f564561e634a8d87e1834875

package _1_6;

import java.io.*;

public class P2249 {
   
   

    private static int n;
    private static int m;
    private static int[] nums;
    private static int[] ks;

    public static void main(String[] args) throws IOException {
   
   
        // algo 快速输入:StreamTokenizer
        StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        // 注意读之前要nextToken,可以写一个fun
        streamTokenizer.nextToken();
        n = (int) streamTokenizer.nval;
        streamTokenizer.nextToken();
        m = (int) streamTokenizer.nval;
        nums = new int[n + 1];
        ks = new int[m];
        for (int i = 1; i <= n; i
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值