话不多说,直接上代码和案例来具体解释:
package patA;
import java.util.Scanner;
public class Text_ernfen3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int text[] = new int[] { 1, 3, 4, 6, 6, 6, 7, 8, 9 };
int length = text.length;
int left = 0;
int right = length - 1;
int t = 4;
int t1 = 6;
int t2 = 2;
int aa1 = binary1(text, left, right, t);
System.out.println("等于4的数的下标=" + aa1);
int aa12 = binary12(text, left, right, t);
System.out.println("等于4的数的下标=" + aa12);
int aa2 = binary2(text, left, right, t);
System.out.println("第一个>4的数的下标=" + aa2);
int aa3 = binary3(text, left, right, t);
System.out.println("最后一个<4的数的下标=" + aa3);
int aa4 = left_bound(text, left, right + 1, t1);
System.out.println("6左侧边界的下标=" + aa4);
int aa5 = right_bound(text, left, right + 1, t1);
System.out.println("6的右侧边界的下标=" + aa5);
int aa6 = dadeng(text, left, right + 1, t2);
System.out.println("第一个>=2的下标=" + aa6);
int aa7 = xiaodeng(text, left, right + 1, t);
System.out.println("最后一个<=4的下标=" + aa7);
}
// 返回=value的数的位置,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b,没有则返回-1,方法一:
public static int binary1(int a[], int left, int right, int t) {
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (a[mid] > t) {
right = mid - 1;
} else if (a[mid] < t) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
// 返回=value的数的位置,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b。没有则返回-1,方法二:
public static int binary12(int a[], int left, int right, int t) {
int mid;
while (left < right) {
mid = (left + right) / 2;
if (a[mid] > t) {
right = mid - 1;
} else if (a[mid] < t) {
left = mid + 1;
} else {
return mid;
}
}
if (a[left] == t) {
return left;
} else {
return -1;
}
}
// 在[left,right]区间范围内找 第一个>value的数的位置,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b
public static int binary2(int a[], int left, int right, int t) {
int mid;
while (left < right) {
mid = (left + right) / 2;
if (a[mid] > t) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
// 在[left,right]区间内找最后一个<value的数的位置,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b
public static int binary3(int a[], int left, int right, int t) {
int mid;
while (left < right) {
mid = (left + right) / 2;
if (a[mid] < t) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
// 寻找左侧边界,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b+1
public static int left_bound(int[] nums, int left, int right, int t) {
if (nums.length == 0)
return -1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == t) {
right = mid;
} else if (nums[mid] < t) {
left = mid + 1;
} else if (nums[mid] > t) {
right = mid;
}
}
return left;
}
// 寻找右侧边界,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b+1
public static int right_bound(int[] nums, int left, int right, int t) {
if (nums.length == 0)
return -1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == t) {
left = mid + 1;
} else if (nums[mid] < t) {
left = mid + 1;
} else if (nums[mid] > t) {
right = mid;
}
}
return left - 1;
}
// 寻找最后一个<=value的值,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b+1
public static int xiaodeng(int[] nums, int left, int right, int t) {
if (nums.length == 0)
return -1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == t) {
return mid;
} else if (nums[mid] < t) {
left = mid + 1;
} else if (nums[mid] > t) {
right = mid;
}
}
return left - 1;
}
// 找第一个>=value的位置,在区间[a,b]中找(a、b均为数组下标),则left=a,right=b+1
public static int dadeng(int[] nums, int left, int right, int t) {
if (nums.length == 0)
return -1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == t) {
left = mid;
} else if (nums[mid] < t) {
left = mid + 1;
} else if (nums[mid] > t) {
right = mid;
}
}
return left;
}
}
执行的结果如下:
等于t的数的下标=2
等于t的数的下标=2
第一个>t的数的下标=3
最后一个<t的数的下标=1
t左侧边界的下标=3
t的右侧边界的下标=5
第一个>=t的下标=1
最后一个<=t的下标=2