zoukankan      html  css  js  c++  java
  • 面试题38:数字在排序数组中出现的次数

    题目描述

    统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

    题目分析

    剑指Offer(纪念版)P204

    代码实现

    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;
    }
    
    // 找到数组中第一个k的下标。如果数组中不存在k,返回-1
    int GetFirstK(int* data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
    
        int middleIndex = (start + end) / 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);
    }
    
    // 找到数组中最后一个k的下标。如果数组中不存在k,返回-1
    int GetLastK(int* data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
    
        int middleIndex = (start + end) / 2;
        int middleData = data[middleIndex];
    
        if(middleData == k)
        {
            if((middleIndex < length - 1 && data[middleIndex + 1] != k) 
                || middleIndex == length - 1)
                return middleIndex;
            else
                start  = middleIndex + 1;
        }
        else if(middleData < k)
            start = middleIndex + 1;
        else
            end = middleIndex - 1;
    
        return GetLastK(data, length, k, start, end);
    }
    

      

  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4896169.html
Copyright © 2011-2022 走看看