1. 二分查找
public class BinarySearch {
public static void main(String[] args) {
int[] nums = {-1, 0, 3, 5, 9, 12};
int target = 9;
System.out.println(search1(nums, target));
System.out.println(search2(nums, target));
}
private static int search1(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
int middle = 0;
while (left <= right) {
middle = (left + right) / 2;
if (nums[middle] == target) {
return middle;
}
if (nums[middle] > target) {
right = middle - 1;
}else {
left = middle + 1;
}
}
return -1;
}
private static int search2(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length;
int middle = 0;
while (left < right) {
middle = (left + right) / 2;
if (nums[middle] == target) {
return middle;
}
if (nums[middle] > target) {
right = middle;
}else {
left = middle + 1;
}
}
return -1;
}
}
2. 二分查找的运用-其他案例:
a. 案例1
public class FindElementsFirstAndEnd {
public static void main(String[] args) {
int[] nums = {5,7,7,8,10};
int target = 8;
int[] result = search(nums, target);
System.out.println(result[0] + "," + result[1]);
int[] ints = searchRange(nums, target);
System.out.println(ints[0] + "," + ints[1]);
}
private static int[] search(int[] nums, int target) {
int first = -1;
int end = -1;
if (nums.length == 0){
return new int[]{first,end};
}
boolean flag = false;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target){
if (!flag){
first = i;
end = i;
flag = true;
}else {
end = i;
}
}
}
return new int[]{first,end};
}
static int[] searchRange(int[] nums, int target) {
int leftBorder = getLeftBorder(nums, target);
int rightBorder = getRightBorder(nums, target);
if (leftBorder == -2 || rightBorder == -2) return new int[]{-1, -1};
if (rightBorder - leftBorder > 1) return new int[]{leftBorder + 1, rightBorder - 1};
return new int[]{-1, -1};
}
static int getRightBorder(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int rightBorder = -2;
while (left <= right) {
int middle = left + ((right - left) / 2);
if (nums[middle] > target) {
right = middle - 1;
} else {
left = middle + 1;
rightBorder = left;
}
}
return rightBorder;
}
static int getLeftBorder(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int leftBorder = -2;
while (left <= right) {
int middle = left + ((right - left) / 2);
if (nums[middle] >= target) {
right = middle - 1;
leftBorder = right;
} else {
left = middle + 1;
}
}
return leftBorder;
}
}
b. 案例2
public class SearchInsertionLocation {
public static void main(String[] args) {
int[] nums = {1,3,5,6};
int target1 = 5;
int target2 = 2;
int target3 = 7;
int target4 = 0;
System.out.println("目标值 5 的索引是:" + searchOfDichotomy2(nums, target1));
System.out.println("目标值 2 的索引是:" + searchOfDichotomy2(nums, target2));
System.out.println("目标值 2 的索引是:" + searchOfDichotomy2(nums, target3));
System.out.println("目标值 0 的索引是:" + searchOfDichotomy2(nums, target4));
}
private static int searchInsert(int[] nums, int target) {
if (nums.length == 0){
return 0;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= target){
return i;
}
}
return nums.length;
}
private static int searchOfDichotomy1(int[] nums, int target) {
if (nums.length == 0){
return 0;
}
int left = 0;
int right = nums.length - 1;
int middle = 0;
while (left <= right){
middle = (left +right)/2;
if (nums[middle] == target){
return middle;
}else if (nums[middle] < target){
left = middle + 1;
}else {
right = middle - 1;
}
}
return right +1;
}
private static int searchOfDichotomy2(int[] nums, int target) {
if (nums.length == 0){
return 0;
}
int left = 0;
int right = nums.length;
int middle = 0;
while (left < right){
middle = (left +right)/2;
if (nums[middle] == target){
return middle;
}
else if (nums[middle] < target){
left = middle + 1;
}else {
right = middle;
}
}
return right;
}
}