统计某个数字在升序数组中出现的次数
题目:给定一个长度为 n的非降序数组和一个非负数整数 k,要求统计 k在数组中出现的次数。
数据范围:
**要求:**空间复杂度为O(1) ,时间复杂度 log(n)
示例1
输入:
[1,2,3,3,3,3,4,5], 3
返回值:4
解题思路:
1.不考虑时间复杂度时,可以用暴力求解——遍历一遍,然后相等则加1.
2.题目中需要考虑时间复杂度,且提示该数组是一个升序数组。——采用二分法求解。
实现1:
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int i;
int count = 0;
int len = data.size();
if((k > 100) || (len > 1000) || k > data[len-1] || len == 0) //注意几种wuxioa
{
return 0;
}
else
{
for(i = 0; i < len; i++)
{
if(k == data[i])
{
count++;
}
}
return count;
}
}
};
实现2:
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int mid,left,right;
int count = 0;
int len = data.size();
left = 0;
right = len -1;
mid = 0;
//不符合题意的场景
if((k > 100) || (len > 1000) || k > data[len-1] || len == 0)
{
return 0;
}
//k值必然出现1次,可以先找到与k值相等的界限作为二分法的mid值。
while(left <= right)
{
mid = (left + right) /2;
if(k > data[mid])
{
left = mid + 1;
}
else if(k < data[mid])
{
right = mid - 1;
}
else
{
count++;
break;
}
}
//找到的中间值mid刚好与k值相等,count此时为1,确定left和right值,分2次对左右两边的值进行遍历。
left = mid - 1;
right = mid + 1;
while(left >= 0 && data[left] == k)
{
count++;
left--;
}
while(right <= len && data[right] == k)
{
count++;
right++;
}
return count;
}
};