【剑指offer】37: 数字在排序数组中出现的次数

时间:2021-05-24 04:50:00   收藏:0   阅读:0

题目描述:

统计一个数字在升序数组中出现的次数。
例如:
[1,2,3,3,3,3,4] 3 
返回:4

解题思路:

看到题目,可直接暴力求解,循环数组,找出出现次数,但此时时间复杂度为O(n)。显然直接遍历,没有很好的利用题目中升序这个已知要求,我们只需要找到目标数字第一次和最后一次出现的位置,并且相减,可以直接得到次数,因此将思路转化为通过二分查找求第一个和最后一个k出现的位置(利用二分查找可以将时间复杂度直接降低为O(nlogn))

代码实现

(C实现):

int GetNumberOfK(int* data, int dataLen, int k ) {
    // write code here
    if (dataLen == 0) return 0;
    int i = 0, j = dataLen - 1, right = 0, left = 0, mid;
    while (i <= j)
    {
        mid = (i + j) / 2;
        if (k >= data[mid]) i = mid + 1;
        else j = mid - 1;
    }
    right = i;
    i = 0;
    j = dataLen - 1;
    while (i <= j) 
    {
        mid = (i + j) / 2;
        if (k > data[mid]) i = mid + 1;
        else j = mid - 1;
    }
    left = j;
    return right - left - 1;
}

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!