面试题五十三:数字在排序数组中出现的次数

 

题目一:数字在排序数组中出现的次数
方法一:使用二分查找找到这个数字,然后在左右展开统计
方法二:分别用二分查找寻找第一个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

posted @ 2020-03-29 16:50  浪波激泥  阅读(263)  评论(0编辑  收藏  举报