法一:由于给定的数组已经是有序的,也就是说相同数字总是在一起,仅需要找出该数字最左边的下标与最右边的下标,两者相减即可,又因为是已排序数组,为了增加速度可以利用二分查找算法。
关键代码如下:
isLeft=true代表找最左边下标,false代表找最右边下标
int binarySearch(const vector<int> &a, int num, bool isLeft)
{
int left = 0, right = a.size() - 1;
int last = -1;
while(left <= right)
{
int mid = (left + right) / 2;
if(a[mid] < num)
left = mid + 1;
else if(a[mid] > num)
right = mid - 1;
else
{
last = mid;
if(isLeft)
{
right = mid - 1;
}
else
left = mid + 1;
}
}
return last == -1 ? -1 : last;
}
法二:利用unordered_map(hash map):序列有哈希函数若排序,将次序列分区到成为存储桶的有序序列中,在每个存储桶中,比较函数将确定任一元素是否具有等效性。此方法也适用于未排序数组
代码如下:
void uMap(const vector<int> &a)
{
unordered_map<int, int> ma;
for(int i = 0; i < a.size(); i++)
{
ma[a[i]]++;
}
cout << ma[5] << endl;
}