码迷,mamicode.com
首页 > 编程语言 > 详细

面试38-数字在排序数组中出现的个数

时间:2015-09-09 22:43:57      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

#include<iostream>
using namespace std;
int countOfNumFromSortArr(int arr[],int len,int num);
int main()
{
  int arr[]={0,1,1,2,2,2,2,3,3,3,4};
  int n;
  cin>>n;
  cout<<countOfNumFromSortArr(arr,sizeof(arr)/sizeof(int),n)<<endl;
  return 0;
}
int countOfNumFromSortArr(int arr[],int len,int num)
{
  if(arr==NULL||len==0)
    return -1;
    int left=0;
    int right=len-1;
  int mid;
  while(left<=right) // 查找算法的复杂度为lg(n)
  {
    mid=(left+right)/2;
    if(arr[mid]==num)// 找到该数字;
      break;
    else if(arr[mid]>num)
      right=mid-1;
    else
      left=mid+1;
  }
  if(left>right)// 没有找到该数字
    return 0;

  int first;int last; //用来记录num的第一个和最后一个下标
  int mid_left,mid_right;
  if(arr[mid-1]!=num)
    first=mid;
  else
  {
    left=0;
    right=mid-1; // 上面找到的Num的位置
    while(right-left!=1) // 关键1
    {
      mid_left=(left+right)/2;
      if(arr[mid_left]==num)
        right=mid_left; // 关键2
      else
        left=mid_left;
    }
    if(arr[left]==num)
      first=left;
    else
      first=right;
  }
  if(arr[mid+1]!=num)
    last=mid;
  else
  {
    left=mid+1;
    right=len-1;
    while(right-left!=1)
    {
      mid_right=(left+right)/2;
      if(arr[mid_right]==num)
        left=mid_right;
      else
        right=mid_right;
    }
  if(arr[right]==num)
    last=right;
  else
    last=left;
  }
  return last-first+1;
}

面试38-数字在排序数组中出现的个数

标签:

原文地址:http://www.cnblogs.com/fchy822/p/4796090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!