剑指offer——数字在排序数组中出现的次数

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:58   1970   0

通过二分查找,找到k在数组中第一次出现的位置和最后一次出现的位置。

#include <iostream>
using namespace std;

int GetFirstK(int *data,int length,int k,int start,int end)
{
 if (start>end)
 {
  return -1;
 }
 int middleIndex=start+(end-start)/2;
 int middleData=data[middleIndex];
 if (middleData==k)
 {
  if (middleIndex>0&&data[middleIndex-1]!=k||middleIndex==0)
  {
   return middleIndex;
  }
  else
  {
   end=middleIndex-1;
  }
 }
 else if(middleData>k)
 {
  end=middleIndex-1;
 }
 else
 {
  start=middleIndex+1;
 }
 return GetFirstK(data,length,k,start,end);
}

int GetLastK(int *data,int length,int k,int start,int end)
{
 if (start>end)
 {
  return -1;
 }
 int middleIndex=start+(end-start)/2;
 int middleData=data[middleIndex];
 if (middleData==k)
 {
  if (middleIndex<length-1&&data[middleIndex+1]!=k||middleIndex==0)
  {
   return middleIndex;
  }
  else
  {
   start=middleIndex+1;
  }
 }
 else if(middleData>k)
 {
  end=middleIndex-1;
 }
 else
 {
  start=middleIndex+1;
 }
 return GetLastK(data,length,k,start,end);
}

int GetNumberOfK(int* data,int length,int k)
{
 int number=0;
 if (data!=NULL&&length>0)
 {
  int first=GetFirstK(data,length,k,0,length-1);
  int last=GetLastK(data,length,k,0,length-1);
  if (first>-1&&last>-1)
  {
   number=last-first+1;
  } 
 }
 return number;
}

int main()
{
 int a[]={1,2,2,2,3,3,3,3,3,3,4,4,5,6};
 cout<<GetNumberOfK(a,14,3)<<endl;
 return 0;
}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP