• 数字在排序数组中出现的次数


    思想:可以采用暴力求解的方法,但时间复杂度高

    采用二分求解的方法,时间复杂度为O(logn)

    具体操作如下:

    寻找第一个K:当二分查找当前的元素为K,判断k是否是第一个k

                                                                      如果当前元素的值不是k ,根据大于k或者小于K来判断k属于前半部分还是后半部分

    寻找最后一个k,使用二分查找的方法,判断当前元素值是否是k,如果是k,并且后面没有k的元素值,如果后面有的话,low=midindex+1

                         如果当前的元素值不是k,判断大于k还是小于k的值,判断二分查找前半部分还是后半部分

    class Solution {
    public:
    int GetNumberOfK(vector<int> data ,int k) {
    int len=data.size();
    if(len==0 || data.empty())
    return 0;
    int number=0;
    int left=Getfirstk(data,0,len-1,len,k);
    int right=Getlastk(data,0,len-1,len,k);
    if(left>-1 && right>-1)
    number= right-left+1;
    return number;
    }
    int Getfirstk(vector<int>&data,int low,int high,int n,int k)
    {
    if(low>high)return -1;
    int midindex=(low+high)>>1;
    int middata=data[midindex];
    //当data[midindex]==k,分成两种情况
    if(middata==k)
    {
    //当前元素是第一个k
    if((midindex>0 && data[midindex-1]!=k )|| midindex==0)
    {
    return midindex;
    }
    //当前元素的值不是第一个K
    else
    {
    high=midindex-1;
    }
    }
    else
    if(middata>k)
    {
    high=midindex-1;
    }
    else
    low=midindex+1;
    return Getfirstk(data,low,high,n,k);
    }
    int Getlastk(vector<int>&data,int low,int high,int n,int k)
    {
    if(low>high)return -1;
    int midindex=(low+high)>>1;
    int middata=data[midindex];
    if(k==middata)
    {
    if((midindex==n-1)||(midindex<n-1 && data[midindex+1]!=k))
    {
    return midindex;
    }
    else
    low=midindex+1;
    }
    else
    if(middata>k)
    {
    high=midindex-1;
    }
    else
    low=midindex+1;
    return Getlastk(data,low,high,n,k);
    }
    };

  • 相关阅读:
    装饰复杂函数
    装饰器01
    闭包
    函数的嵌套定义
    名称空间
    函数的嵌套调用
    函数的对象
    形参
    实参
    形参与实参
  • 原文地址:https://www.cnblogs.com/xiaoji123/p/10598107.html
Copyright © 2020-2023  润新知