前言
最近时间有点紧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);
}
}