题目一:数字在排序数组中出现的次数
方法一:使用二分查找找到这个数字,然后在左右展开统计
方法二:分别用二分查找寻找第一个k和最后一个K,再相减
static int findk(int a[],int k) { if(a==null||a.length<1) return 0; int be=0; int end=a.length-1; int i1=-1; int inter; while(be<=end) { inter=(be+end)>>1; if(a[inter]<k) be=inter+1; else if(a[inter]>k) end=inter-1; else { if(inter==0||a[inter-1]<k) { i1=inter; break; } else end=inter-1; } } if(i1==-1)return 0; be=i1; end=a.length-1; int i2=-1; while(be<=end) { inter=(be+end)>>1; if(a[inter]<k) be=inter+1; else if(a[inter]>k) end=inter-1; else { if(inter==a.length-1||a[inter+1]>k) { i2=inter; break; } else be=inter+1; } } if(i2>=i1) return i2-i1+1; return 0; }
题目二:0-n-1中缺失的元素
一个长度为n-1的递增排序数组中数字唯一的,数字范围在0-n-1之内的n个数字有且只有一个数字不在数组中,找出该数字
方法一:直接使用二分查找,如果值和下标相等,那么该数字在右边,如果值大于下标,且它的上一个值等于下标就返回当前下标,否则那么在左边
1 static int GetmissNumber(int a[]) { 2 if(a==null||a.length<1) return 0; 3 int be=0; 4 int end=a.length-1; 5 int <u>i1</u>=-1; 6 int inter; 7 while(be<=end) { 8 inter=(be+end)>>1; 9 if(a[inter]==inter) 10 be=inter+1; 11 else { 12 if(inter==0||(a[inter]>inter&&a[inter-1]==inter-1)) 13 return inter; 14 end=inter-1; 15 } 16 } 17 return -1; 18 }
题目三:寻找下标与值相同元素
方法:二分查找;如果下标大于值那么在右边,如果下标小于值则在左边,找不到返回-1