数字在排序数组中出现的次数
Posted IIcyZhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字在排序数组中出现的次数相关的知识,希望对你有一定的参考价值。
// 利用二分查找,找到之后再分别利用二分查找,找出第一次出现的位置和最后一次出现的位置
#include<iostream>
#include<algorithm>
#include<time.h>
using namespace std;
int* findFirst(int * arr, int size, int target)
if (arr == NULL || size <= 0)
return NULL;
int * mid = arr + (size >> 1);
if (*mid > target)
return findFirst(arr, mid - arr, target);
else if (*mid < target)
return findFirst(mid + 1, size - (mid - arr) - 1, target);
else
if (mid == arr || mid > arr && *(mid-1) < target) // 注意边界条件检查 mid == arr (mid为第一个)
return mid;
else
return findFirst(arr, mid - arr, target); // 利用二分查找向前找第一个
int * findLast(int * arr, int size, int target)
if (arr == NULL || size <= 0)
return NULL;
int * mid = arr + (size >> 1);
if (*mid > target)
return findLast(arr, mid - arr, target);
else if (*mid < target)
return findLast(mid + 1, size - (mid - arr) - 1, target);
else
if (mid == arr + size - 1 || mid < arr + size && *(mid+1) > target) // mid == arr + size - 1 (mid为最后一个)
return mid;
else
return findLast(mid + 1, size - (mid - arr) - 1, target); // 利用二分查找向后找最后一个
int getCount(int * arr, int size, int target)
int * first = findFirst(arr, size, target);
int * last = findLast(arr, size, target);
if (first == NULL || last == NULL) // 注意不存在的情况
return 0;
return last - first + 1;
void printArr(int * arr, int size)
for (int i = 0; i < size; ++i)
cout << *(arr + i) << " ";
cout << endl;
int main()
srand((int)time(0));
const int SIZE = 20;
int arr[SIZE];
for (int i = 0; i < SIZE; i++)
arr[i] = rand() % SIZE;
printArr(arr, SIZE);
sort(arr, arr + SIZE);
printArr(arr, SIZE);
int target = 0;
int cnt = SIZE >> 1;
while(cnt--)
cout << "Input target: ";
cin >> target;
cout << target << "'s count: " << getCount(arr, SIZE, target) << endl;
return 0;
以上是关于数字在排序数组中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章