题目描述
统计一个数字在排序数组中出现的次数。
解题思路
1、循环扫描所有数组进行计数,时间复杂度为n,但是忽略了是排序的这一特性。
2、使用二分查找的思想,关键判断为当当前数字等于k时,如果前一数字不等于k,则该处为第一次出现k的位置。判断最后一个K同理。
C++
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size() == 0)
return 0;
int firstK = FindFirstK(data, k, 0, data.size()-1);
int lastK = FindLastK(data, k, 0, data.size()-1);
//避免数组中没有出现过的数字也返回1
if(firstK != -1 && lastK != -1){
return lastK - firstK + 1;
}
return 0;
}
//找到第一个出现的K,二分查找
int FindFirstK(vector<int> &data, int k, int begin, int end){
if(begin>end)
return -1;
int mid = (begin + end) >> 1;
if(data[mid] > k){
end = mid-1;
}
else if(data[mid] < k){
begin = mid+1;
}
else{
//如果查找的数等于k 但是它前面的一个数不等于k,那么他就是第一个出现的K
if((mid>0 && data[mid-1]!=k)||mid == 0)
return mid;
else
end = mid-1;
}
return FindFirstK(data, k, begin, end);
}
int FindLastK(vector<int> &data, int k, int begin, int end){
if(begin>end)
return -1;
int mid = (begin + end) >> 1;
if(data[mid] > k){
end = mid-1;
}
else if(data[mid] < k){
begin = mid+1;
}
else{
if((mid<data.size()-1 && data[mid+1]!=k) || mid == data.size()-1){
return mid;
}
else{
begin = mid+1;
}
}
return FindLastK(data, k, begin, end);
}
};
Python
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
return data.count(k)