什么是二分查找,二分查找就是比较在比较在比较。
大白话:二分查找必须要基于升序或者降序进行查找,就好像在一堆女子中找到和自己一样大的进行结婚,当然你也可以从头开始一个一个问,这样就会全部问完,但是二分查找就会是,问中间的那个,判断在问中间的,直到找到目标值。
上案例:
第一种思路:切记左边开头是0,右边开头是nums的长度,判断条件左边小于等于右边,
下面解释为什仫:
第一,数组下标从0开始,长度从一开始,如果判断条件等于忘写,则程序不正确,因为如果刚好是左和右相等时刚好是答案,但是缺不会找到,因为判断条件原因,第二,就是左加右除以2不是很好,因为在长度极限大时会溢出,所以用方案二解决问题二,方案三改进方案一。
方案一:
public class ErFen {
public static int find(int[]nums ,int target){
int left = 0;
int right = nums.length-1;
while (left<=right){
int dim = (left+right)/2;
int num = nums[dim];
if (num>target){
right = dim -1;
}else if (num<target){
left = dim + 1;
}else {
return dim;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7,8,9};
System.out.println(find(nums,1));
System.out.println(find(nums,2));
System.out.println(find(nums,3));
System.out.println(find(nums,4));
System.out.println(find(nums,22));
}
}
方案二:
public class ErFen {
public static int find(int[]nums ,int target){
int left = 0;
int right = nums.length-1;
while (left<=right){
int dim = left+right>>>1;
int num = nums[dim];
if (num>target){
right = dim -1;
}else if (num<target){
left = dim + 1;
}else {
return dim;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7,8,9};
System.out.println(find(nums,1));
System.out.println(find(nums,2));
System.out.println(find(nums,3));
System.out.println(find(nums,4));
System.out.println(find(nums,22));
}
}
方案三:
public class ErFen {
public static int find(int[]nums ,int target){
int left = 0;
int right = nums.length;
while (left<right){
int dim = left+right>>>1;
int num = nums[dim];
if (num>target){
right = dim;
}else if (num<target){
left = dim + 1;
}else {
return dim;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7,8,9};
System.out.println(find(nums,1));
System.out.println(find(nums,2));
System.out.println(find(nums,3));
System.out.println(find(nums,4));
System.out.println(find(nums,22));
}
}