目:统计一个数字k在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,输出4次
方案一:扫描数组,记录第一个出现的k和最后一个k中间有多少个,时间复杂度为O(n)
方案二:由于数组是有序的,那么我们可以利用二分的思想,求出k在数组中的第一个位置和最后位置相减即可。时间复杂度为O(logN)
注意严格按照良好的C++编码风格
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- //规定没有找到返回-1
- int GetFirstIndex(int *arrNum, int left, int right, int k){
- if(arrNum == NULL || left > right){
- return -1;
- }
- while(left <= right){
- int mid = (left+right)>>1;
- if(arrNum[mid] > k){
- right = mid-1;
- }
- else if(arrNum[mid] < k){
- left = mid+1;
- }
- else{
- if((mid > 0) && (arrNum[mid-1] == k)){
- right = mid-1;
- }
- else{
- return mid;
- }
- }
- }
- return -1;
- }
- //规定没有找到返回-1
- int GetLastIndex(int *arrNum, int left, int right, int k){
- if(arrNum == NULL || left > right){
- return -1;
- }
- while(left <= right){
- int mid = (left+right)>>1;
- if(arrNum[mid] > k){
- right = mid-1;
- }
- else if(arrNum[mid] < k){
- left = mid+1;
- }
- else{
- if((mid < right-1) && (arrNum[mid+1] == k)){
- left = mid+1;
- }
- else{
- return mid;
- }
- }
- }
- return -1;
- }
- int main(){
- int arrNum[] = {1,2,3,3,3,3,4,5};
- //求出第一个和最后一个位置
- int firstIndex = GetFirstIndex(arrNum, 0, 7, 3);
- int lastIndex = GetLastIndex(arrNum, 0, 7, 3);
- if(firstIndex != -1 && lastIndex != -1){
- cout<<(lastIndex-firstIndex+1)<<endl;
- }
- else{
- cout<<-1<<endl;
- }
- return 0;
- }