解法一(哈希法)
思想
很显然,把数组中的数放到一个哈希表中,然后返回k对应的次数。
代码实例
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//哈希
unordered_map<int,int> mp;
for(int i = 0;i<data.size();++i)
{
++mp[data.at(i)];
}
return mp[k];
}
};
解法二(二分法)
思想
上述方法没有用到数组非降序的性质,很显然对于有序数组我们可以使用二分法。由于k出现后一定是连续的,这里利用二分查找找k-0.5的位置和k+0.5的位置,这样k出现的次数就是这两个位置相减后得到的值。
代码实例
class Solution {
public:
int bSearch(vector<int> &vec, double k)
{
int start = 0;
int end = vec.size() - 1;
while (start <= end)
{
int mid = (start + end);
if (k < vec[mid])
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
return start;
}
int GetNumberOfK(vector<int> vec ,int k) {
int start = bSearch(vec, k - 0.5);
int end = bSearch(vec, k + 0.5);
return end - start;
}
};