10、在排序数组中,找出给定数字出现的次数

 

10、在排序数组中,找出给定数字出现的次数

分类: c++   514人阅读  评论(0)  收藏  举报
[cpp]  view plain copy
  1. /************************************************************************/  
  2. /* 10、在排序数组中,找出给定数字出现的次数                                        */  
  3. /************************************************************************/  
  4. //二分查找,二分查找key第一次出现的位置,二分查找最后一次出现的key  
  5. //返回两者相减+1或者找到第一次出现的位置,向后查找  
  6. int binarySearchFirstPos(int * iArr, int l, int h, int key)  
  7. {  
  8.     while(l <= h )  
  9.     {  
  10.         int mid  = (l + h) / 2;  
  11.         if(iArr[mid] < key)  
  12.             l = mid +1;  
  13.         else if(iArr[mid] > key)  
  14.             h = mid - 1;  
  15.         else  
  16.         {  
  17.             if(mid == l || iArr[mid - 1] != key)  
  18.                 return mid;  
  19.             else   
  20.                 h = mid - 1;  
  21.         }  
  22.     }  
  23.     return -1;  
  24. }  
  25. int binarySearchLastPos(int * iArr, int l, int h, int key)  
  26. {  
  27.     while(l <= h)  
  28.     {  
  29.         int mid = (l + h) / 2;  
  30.         if(iArr[mid] < key)  
  31.             l =  mid + 1;  
  32.         else if(iArr[mid] > key)  
  33.             h = mid - 1;  
  34.         else  
  35.         {  
  36.             if(mid == h || iArr[mid + 1] != key)  
  37.                 return mid;  
  38.             else  
  39.                 l = mid + 1;  
  40.         }  
  41.     }  
  42.     return -1;  
  43. }  
  44. int numOfKey(int * iArr, int length, int key)  
  45. {  
  46.     int firstPos = binarySearchFirstPos(iArr, 0, length - 1, key);  
  47.     int lastPos = binarySearchLastPos(iArr, 0, length - 1, key);  
  48.     cout << firstPos << "\t" << lastPos << endl;;  
  49.     if(firstPos == -1)  
  50.         return 0;  
  51.     else  
  52.         return lastPos - firstPos + 1;  
  53. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值