思路:
1.首先找到需要查找数字x的左边界
2.其次查到到x的又边界
重点:
查到边界的方法使用二分
注意事项:
在查找x右边界时,mid = (l + r + 1) / 2,是为了防止陷入while的死循环
在查找x左边界时:
while(l < r) {
int mid = (l + r) / 2;
if(num[mid] >= x)
r = mid;
else
l = mid + 1;
}
在查找x右边界时:
while(l < r) {
int mid = (l + r) / 2;
if(num[mid] <= x)
l = mid;
else
r = mid - 1;
}
整理代码如下:
package cn.liyi.day03;
import java.util.Scanner;
public class Demo189 {
public static int[] num = {1, 2, 2, 3, 3, 4};
public static int n = 6;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
while (m-- > 0) {
int x = sc.nextInt();
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r) / 2;
if (num[mid] >= x)
r = mid;
else
l = mid + 1;
}
if (num[l] != x)
System.out.println("-1 -1");
else {
System.out.print(l + " ");
l = 0;
r = n - 1;
while (l < r) {
int mid = (l + r + 1) / 2;
if (num[mid] <= x)
l = mid;
else
r = mid - 1;
}
System.out.println(l);
}
}
}
}
该博客介绍了如何在有序数组中利用二分查找算法找到指定数字的左右边界。通过详细步骤解释了查找左边界和右边界的过程,特别指出在查找右边界时为了避免死循环,应当设定`mid = (l + r + 1) / 2`。最终提供了完整的代码实现。

781

被折叠的 条评论
为什么被折叠?



