数字在非降序数组中出现的次数

牛客网链接

描述

给定一个长度为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都可以
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值