面试题32:数字在排序数组中出现的次数
2013-07-26 20:31
330 查看
思路:利用二分查找分别求出该数字在数组中第一次和最后一次出现的位置下标
代码:
#include "stdafx.h" #include <iostream> #include <assert.h> using namespace std; //找到数组中第一次出现key的元素的下标 int BinarySearchFirstKey(int nArr[], int nLength, int key) { assert(nArr != NULL && nLength > 0); int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] >= key) { nHigh = nMid - 1; } else { nLow = nMid + 1; } } if (nLow >= 0 && nLow < nLength && nArr[nLow] == key) { return nLow; } else { return -1; } } //找到数组中最后一次出现key的元素的下标 int BinarySearchLastKey(int nArr[], int nLength, int key) { assert(nArr != NULL && nLength > 0); int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] > key) { nHigh = nMid - 1; } else { nLow = nMid + 1; } } if (nHigh >= 0 && nHigh < nLength && nArr[nHigh] == key) { return nHigh; } else { return -1; } } int GetNumberOfKey(int nArr[], int nLength, int key) { assert(nArr != NULL && nLength > 0); if (BinarySearchFirstKey(nArr, nLength, key) != -1) { return BinarySearchLastKey(nArr, nLength, key) - BinarySearchFirstKey(nArr, nLength, key) + 1; } else { return -1; } } int _tmain(int argc, _TCHAR* argv[]) { int nArr[8] = {1,2,3,3,3,3,4,5}; int key = 0; cin >> key; cout << GetNumberOfKey(nArr, 8, key) << endl; system("pause"); return 0; }运行结果:
相关文章推荐
- 剑指Offer面试题:32.数字在排序数组中出现的次数
- 【剑指offer】面试题38-数字在排序数组中出现的次数
- 剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数
- 面试题38:数字在排序数组中出现的次数
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 面试题 38数字在排序数组中出现的次数
- (剑指Offer)面试题38:数字在排序数组中出现的次数
- 面试题38_数字在排序数组中出现的次数
- 剑指offer面试题38:数字在排序数组中出现的次数
- 面试题38:数字在排序数组中出现的次数
- 《剑指Offer》面试题:统计一个数字在排序数组中出现的次数
- 面试题38:数字在排序数组中出现的次数
- 剑指Offer:面试题38 数字在排序数组中出现的次数
- 剑指offer面试题38:数字在已排序数组中出现的次数
- 【面试题038】数字在排序数组中出现的次数
- 面试题38:数字在排序数组中出现的次数
- 剑指offer-面试题38-数字在排序数组中出现的次数
- 面试题38:数字在排序数组中出现的次数
- 剑指Offer----面试题38:数字在排序数组中出现的次数
- 剑指offer 面试题38—数字在排序数组中出现的次数