题目:统计一个数字下排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。
当然第一眼就能想到遍历这个数组然后统计这个数组中某个数字出现的次数。当然第一眼就能想到的方法通常来说效率都不怎么样
再稍微想一下这个题目,是一个已序的数组,所以呢,不难想到二分查找。
我们可以先用二分查找找到一个3,这个3的左右两边有可能还有3,所以我们可以分别在它的左边和右边继续缩小范围查找3。知道分别找到了第一个3和最后一个3,那么这之间3的个数自然而然就出来了。
思路简单,代码也不难:
首先当然是二分查找的代码了:
int BinarySearch(int *arr, int len, int k) { int start = 0, end = len - 1; if (NULL == arr || len <= 0) return -1; while (start <= end) { int mid = (end - start) / 2 + start; if (arr[mid] == k) return mid; else if (arr[mid] < k) start = mid + 1; else end = mid - 1; } }
接下来就看具体怎么调用这个函数了:int TimesOfNumInSortArray(int *arr, int size, int k) { int left, right; if (NULL == arr) return -1; left = BinarySearch(arr, size, k); right = left; while (left > 0 && arr[left - 1] == k) { left = BinarySearch(arr, left, k); } while (right < size - 1 && arr[right + 1] == k) { right = BinarySearch(arr + right, size - right - 1, k); } return right - left + 1; }
这个算法的时间1复杂度是O(logn)哦!
数字在排序数组中出现的次数
最新推荐文章于 2024-08-15 16:36:10 发布