class Solution {
public:
int GetNumberOfK(vector<int> data, int k) {
int length = data.size();//求数组长度
int i = 0;
int count = 0;
while (i < length)
{
if (data[i] == k)
{
count++;
}
i++;
}
return count;
}
};
//利用二分法来求
class Solution {
public:
int GetNumberOfK(vector<int> data, int k) {
int length = data.size();//求数组长度
int mid = length/2;//中间的位置下标
int left = 0;
int right = length-1;
int count = 0;
while (left<=right)
{
mid = (left + right) / 2;
if (data[mid] == k)
break;
if (data[mid] > k)
{
right=mid-1; //如果说mid的数据比k要大说明k在mid 的左边
}
else
{
left=mid+1;
}
}
//退出循环的时候已经找到k了或者说里边没有k
if (left > right)
{
return 0;
}
else
{
int mid2 = mid;
while (data[mid] == k && mid>=0)
{
count++;
mid--;
}
while (data[mid2] == k&&mid2<=length)
{
count++;
mid2++;
}
}
return count - 1;
}
};
这里有几个需要注意的点:第一个就是int right = length-1;最右边的下标一定要是长度减去1,一定要减去1,不然很大几率就会出现数组越界的情况。第二个就是right=mid-1; left=mid+1;这里对right和left赋值的时候,这里并不是说无非就是把这个位置遍历两边的问题,如果不减去1或者加上1是可能让你的程序出现死循环的,