自己看了一遍概念写的二分法
题目为假设有个n个长度的数组,控制台输入数组所存数字,再输入要查询的目标数字,如果该数字在数组中存在,则输入下标,若不存在则输入-1;
下图为Java代码实现:
import java.util.*;
public class summer_test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0;i<n;i++) {
nums[i] = sc.nextInt();
}
int target = sc.nextInt();
int low = 0;
int height = n-1;
int flag = 0;//判断该数是否存在于该数组
while(height>=low) {
int middle = (low+height)/2;
if(target == nums[middle]) {
System.out.print(middle);
flag=1;
break;
}else if(target>nums[middle]) {
low = middle+1;
}else if(target<nums[middle]) {
height = middle-1;
}
}
if(flag==0) {
System.out.print("-1");
}
}
}
}
题型二 数组中同一数字多次出现,计算这个数字出现的次数一共有多少次
假设有一组数组长度为n,里面一共有n个数字,其数字的重复性可能重复,可能不重复,控制台输入数字,求出这个数字在数组中重复出现的次数
1.第一种方法为如果这个数组里面都是整数,则可以目标数两边各取一个距离为0.5的数为a,b,然后通过二分定位找到a,b两个数的low值,也就是left,然后返回相减,可获得次数。
2.第二种方法为找这个目标数的left和right,两边相减就是次数了。
3.第二种方法的优化为因为二分法使用的原则是,数组里面的数字必须得按照顺序排列好,所以可以先找完right,确定右边的边界存在后,再找到left,这样就更简洁,如果right不存在,则可以直接返回找不到。