描述
给定一个长度为numsLen 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
1.定义变量count计数法。
int GetNumberOfK(int* nums, int numsLen, int k)
{
int i = 0;
int count = 0;
for (i = 0; i < numsLen; i++)
{
if (nums[i] == k)
count++;
}
return count;
}
int main()
{
int nums[] = { 1,2,3,4,5,6,6,7 };
int numsLen = sizeof(nums) / sizeof(nums[0]);
printf("%d", GetNumberOfK(nums, numsLen, 6));
return 0;
}
2.二分法(推荐使用)
要是能刚好找到恰好等于k的数字位置和恰好大于k的数字的位置相减就好了。
再有因为数组中全是整数,因此我们可以考虑,用二分查找找到
k+0.5应该出现的位置和k−0.5应该出现的位置,二者相减就是k出现的次数。
int position(int* nums, int numsLen, double k)
{
int left = 0, right = numsLen - 1, mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (nums[mid] < k)
left = mid + 1;
else if (nums[mid] > k)
right = mid - 1;
}
return left;//right也行
}
int GetNumberOfK(int* nums, int numsLen, int k)//不知道为什么double k通不过
{
return position(nums, numsLen, k + 0.5) - position(nums, numsLen, k - 0.5);
}
int main()
{
int nums[] = { 1,2,7,9 };
int numsLen = sizeof(nums) / sizeof(nums[0]);
printf("%d", GetNumberOfK(nums, numsLen, 6));
return 0;
}
排除空数组的情况
(1)不存在
k+0.5和k-0.5的流程是一样的,返回的值一样,所以返回left,right,mid都行
以下是数组1, 2,7,9。统计5的个数,不管是4.5还是5.5都是这个流程。相减等于0。
(2)存在
以下是数组1, 2,2,2,7,9。统计2的个数
- 1.5 (k-0.5)
- 2.5 (k+0.5)
left在1.5右边(第一个2),2.5右边(最后一个2后一位),相减即是几个2.
所以position返回值不能是mid,left和right都可以