【剑指offer系列】 数字在排序数组中出现的次数___38

  题目描述:
  统计一个数字在排序数组中出现的次数
  
  示例:
  输入:数组{1 ,2 ,3 ,3 ,3 ,3 ,4 ,5}和数字3
  输出:4
  
  分析:
  数组的查找可以利用二分法的思想,分别在数组中找到数字第一次出现和最后一次出现的位置,则出现的次数为二者下标之差 。时间复杂度为O(nlgn).
  
  代码: 

int getFirst(vector<int>& nums,int k,int begin,int end){
    if(begin<end)   return -1;
    int mid=begin+(end-begin)/2;
    if(nums[mid]==k){
        if(mid==0||nums[mid-1]!=k)  return mid;
        else end=mid-1;
    }else if(nums[mid]>k){
        end=mid-1;
    }else{
        begin=mid+1;
    }
    return getFirst(nums,k,begin,end);
}
int getLast(vector<int>& nums,int k,int begin,int end){
    if(begin<end)   return -1;
    int mid=begin+(end-begin)/2;
    if(nums[mid]==k){
        if(mid!=nums.size()-1||nums[mid+1]!=k)  return mid;
        else begin=mid+1;
    }else if(nums[mid]>k){
        end=mid-1;
    }else{
        begin=mid+1;
    }
    return getLast(nums,k,begin,end);
}
int getTimes(vector<int>& nums,int k){
    int first=getFirst(nums,k,0,nums.size()-1);
    int last=getLast(nums,k,0,nums.size()-1); 

    if(first==-1||last==-1) return 0;
    return last-first+1;
}

你可能感兴趣的:(【剑指offer系列】 数字在排序数组中出现的次数___38)