题目:统计有序数组中排序某一个数出现的次数
比如:{1, 2,2,2,3 ,4 , 5}中,2出现了3次,3出现了0次
思路:
利用二分查找,找到某一个数在数组中出现的第一个下标firstIndex和最后一个下标lastIndex
出现次数就是:lastIndex - firstIndex + 1
比如:{1, 2,2,2,3 ,4 , 5}中,2出现了3次,3出现了0次
思路:
利用二分查找,找到某一个数在数组中出现的第一个下标firstIndex和最后一个下标lastIndex
出现次数就是:lastIndex - firstIndex + 1
#include <iostream>
using namespace std;
#define NSIZ 100
int GetFirsIndex(int data[], int n, int key)
{
int left = 0;
int right = n - 1;
int mid = 0;
while(left <= right)
{
mid = left + (right - left) /2 ;
if (data[mid] == key)
{
if (mid > 0 && data[mid - 1] != key || mid == 0)
{
return mid;
}
else
{
right = mid - 1;
}
}
else if (data[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
int GetLastIndex(int data[], int n, int key)
{
int left = 0;
int right = n - 1;
int mid = 0;
while(left <= right)
{
mid = left + (right - left) /2 ;
if (data[mid] == key)
{
if (mid < n-1 && data[mid + 1] != key || mid == (n-1))
{
return mid;
}
else
{
left = mid + 1;
}
}
else if (data[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
int getNum(int data[], int n, int key)
{
int first = GetFirsIndex(data, n, key);
int last = GetLastIndex(data, n, key);
if (first != -1 && last != -1)
{
return last - first + 1;
}
return 0;
}
int main()
{
int data[] = {1, 2,2,2,3 ,4 , 5};
int n = sizeof(data)/sizeof(data[0]);
int key = 2;
printf("Key:%d 个数:%d\n",key, getNum(data, n, key));
return 0;
}