在排序数组中,找出给定数字出现的次数比如{ 1, 2, 2, 2, 3}中2的出现次数是3次
我们可使用二分查找发,分别查找出2最先出现的位置和最后出现的位置相减即可。
下面是上代码:
#include运行效果如图://二分法获取元素最后出现的位置,可能在元素的下一位int GetHigh(int array[], int size, int key){ int low = 0, high = size - 1; while (low < high) { int mid = (low + high) / 2; if (array[mid] <= key) { low = mid+1; } else { high = mid; } } return low;}//二分法获取元素最先出现的位置,可能在元素的前一位int GetLow(int array[], int size, int key){ int low = 0, high = size - 1; while (low < high) { int mid = (low + high + 1) / 2; if (array[mid] >= key) { high = mid-1; } else { low = mid; } } return high;}//计算key出现总次数int GetCount(int array[], int size, int key){ int high = GetHigh(array, size, key); int low = GetLow(array, size, key); int count = high - low + 1; if (array[high] != key) count--; if (array[low] != key) count--; return count;}int arr[] = { 1, 2, 2, 2, 3};int main(){ //打印出2在数组中出现的次数 printf("出现次数:%d \n", GetCount(arr, 5, 2)); return 0;}
如果有什么问题和疑问可以在下面留言互相探讨。
原题我已经上传到这里了 ,
解压密码为 c.itcast.cn