当前位置: 首页 > ops >正文

算法竞赛相关 Java 二分模版

目录

找和目标值相关

方法 Arrays.binarySearch();

二分答案模版


找和目标值相关

public class BinarySearchTemplate {// 查找大于 x 的最小值(即严格上界)public static int upperBound(int[] arr, int x) {int left = 0, right = arr.length;while (left < right) {int mid = left + (right - left) / 2;if (arr[mid] > x) {right = mid;} else {left = mid + 1;}}if(left<0||left>arr.length-1) {return -1; // -1 表示没有找到符合条件的元素}else {return arr[left]; 	}}// 查找大于等于 x 的最小值(即第一个不小于 x 的元素)public static int lowerBound(int[] arr, int x) {int left = 0, right = arr.length;while (left < right) {int mid = left + (right - left) / 2;if (arr[mid] >= x) {right = mid;} else {left = mid + 1;}}if(left < 0||left > arr.length-1) {return -1; // -1 表示没有找到符合条件的元素}else {return arr[left]; 	}}// 查找小于 x 的最大值(即严格下界)public static int floor(int[] arr, int x) {int left = -1, right = arr.length - 1;while (left < right) {int mid = left + (right - left + 1) / 2;if (arr[mid] < x) {left = mid;} else {right = mid - 1;}}if(left < 0||left > arr.length-1) {return -1; // -1 表示没有找到符合条件的元素}else {return arr[left]; 	}}// 查找小于等于 x 的最大值(即最后一个不大于 x 的元素)public static int ceiling(int[] arr, int x) {int left = -1, right = arr.length - 1;while (left < right) {int mid = left + (right - left + 1) / 2;if (arr[mid] <= x) {left = mid;} else {right = mid - 1;}}if(left < 0||left > arr.length-1) {return -1; // -1 表示没有找到符合条件的元素}else {return arr[left]; 	}}// 测试示例public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11};int x = 6;System.out.println("大于 " + x + " 的最小值: " + upperBound(arr, x)); // 输出 7System.out.println("大于等于 " + x + " 的最小值: " + lowerBound(arr, x)); // 输出 7System.out.println("小于 " + x + " 的最大值: " + floor(arr, x)); // 输出 5System.out.println("小于等于 " + x + " 的最大值: " + ceiling(arr, x)); // 输出 5}
}

方法 Arrays.binarySearch();

例题 P2249 【深基13.例1】查找 - 洛谷

题解

// @github https://github.com/Dddddduo
// @github https://github.com/Dddddduo/acm-java-algorithm
// @github https://github.com/Dddddduo/Dduo-mini-data_structure
import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;/*** 题目地址**/// xixi♡西
public class Main {static IoScanner sc = new IoScanner();static final int mod = (int) (1e9 + 7);
//    static final int mod = (int) (1e9 + 7);//    static int n;
//    static int arr[];
//    static boolean visited[];
//    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();/*** @throws IOException*/private static void solve() throws IOException {// todoint n=sc.nextInt();int m=sc.nextInt();long arr[]=new long[n];for(int i=0;i<n;i++) {arr[i]=sc.nextLong();}StringBuilder sb=new StringBuilder("");for(int i=0;i<m;i++) {long target=sc.nextLong();int index = Arrays.binarySearch(arr, target);if (index >= 0) {while (index > 0 && arr[index - 1]==target) {index--;}} index+=1;if(index<1||index>n) {sb.append("-1 ");}else {sb.append(index+" ");}}dduoln(sb);}public static void main(String[] args) throws Exception {int t = 1;
//        t = sc.nextInt();while (t-- > 0) {solve();}}static <T> void dduo(T t) {System.out.print(t);}static <T> void dduoln() {System.out.println("");}static <T> void dduoln(T t) {System.out.println(t);}
}/*** IoScanner类** @author Dduo* @version 1.0* @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。*/
class IoScanner {BufferedReader bf;StringTokenizer st;BufferedWriter bw;public IoScanner() {bf = new BufferedReader(new InputStreamReader(System.in));st = new StringTokenizer("");bw = new BufferedWriter(new OutputStreamWriter(System.out));}public String nextLine() throws IOException {return bf.readLine();}public String next() throws IOException {while (!st.hasMoreTokens()) {st = new StringTokenizer(bf.readLine());}return st.nextToken();}public char nextChar() throws IOException {return next().charAt(0);}public int nextInt() throws IOException {return Integer.parseInt(next());}public long nextLong() throws IOException {return Long.parseLong(next());}public double nextDouble() throws IOException {return Double.parseDouble(next());}public float nextFloat() throws IOException {return Float.parseFloat(next());}public BigInteger nextBigInteger() throws IOException {return new BigInteger(next());}public BigDecimal nextDecimal() throws IOException {return new BigDecimal(next());}
}

二分答案模版

    	long left=0;long right=(long) 1e9;long mid=0;while(left<right) {mid =left+(right-left)/2;if(judge(mid)==true) {right = mid;}else {left = mid+1;}}dduoln(left);
http://www.xdnf.cn/news/5896.html

相关文章:

  • 课题推荐——低成本地磁导航入门,附公式推导和MATLAB例程运行演示
  • XILINX-配置(引脚复用)
  • 【Nova UI】十六、打造组件库之滚动条组件(中):探秘滑块的计算逻辑
  • JavaScript进阶(九)
  • 定时器(两种)
  • 芋道(yudao-cloud)项目,后端接口报401-账号未登录解决方案
  • deepseek梳理java高级开发工程师微服务面试题
  • AD PCB布线的常用命令
  • EasyOps®5月热力焕新:三大核心模块重构效能边界
  • LeetCode LCR 016. 无重复字符的最长子串 (Java)
  • 工业巡检机器人 —— 机器人市场的新兴增长引擎
  • NY182NY183美光固态颗粒NY186NY188
  • 宽频带地震仪,便携、高效,守护安全防线
  • STM32 ADC 模数转换器详解:原理、配置与应用
  • 物理:由基本粒子组成的个体能否提炼和重组?
  • tiny core linux系统详解
  • 我喜欢的vscode几个插件和主题
  • 从入门到精通:Drools全攻略
  • webservice获取全国省份区县编码(拼音全拼+拼音简写)
  • 深度学习 自然语言处理(RNN) day_02
  • 2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
  • 基于C#+MySQL实现(WinForm)企业设备使用信息管理系统
  • Linux进程信号保存(25)
  • 大数据——解决Matplotlib 字体不足问题(Linux\mac\windows)
  • 基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)
  • 《数据库原理》部分习题解析
  • quickbi单个空间限制1000数据集引发的企业在使用过程中的思考和反思及建议。
  • 用AI制作黑神话悟空质感教程,3D西游记裸眼效果,西游人物跳出书本
  • 【Linux】进程通信 管道
  • MySQL三种模糊查询方式:​​LIKE、REGEXP和FULLTEXT