El número de veces (27) número que aparece en la matriz de tipo

Uno de los temas:El número de veces que el número que aparece en la matriz de una especie

[Número A de número estadístico que aparece en la matriz de tipo. El {1,2,3,3,3,3,4} y el número 3, 4 que ocurren debido 3, la salida 4]

Método uno: el recorrido directo

1, el análisis
comenzó a contar el número de veces que aparece directamente a través de la matriz, porque la matriz ya está ordenada, por lo que la aparición de k digital cuando la matriz. La complejidad del tiempo de este método es la ( norte ) O (n) , así como más rápido dicotomía.
2, el código

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int len=data.size();
        if(len<=0 || k<data[0] || k>data[len-1])
            return 0;
        int count=0;
        vector<int>::const_iterator it=data.begin();
        while(it!=data.end())
        {
            if((*it)==k)
                ++count;
            it++;
        }
        return count;
    }
};
Segundo método: Mejora de búsqueda binaria

1, el análisis
utilizando un método de búsqueda binaria modificada: k es el número que se debe buscar

  • Cuando la matriz intermedia es mayor que el número k, la k en una antigua
  • Cuando la matriz intermedia es menor que el número k, que se encuentra en la segunda mitad de la k
  • Cuando el número de matriz intermedia k es igual a, la necesidad de continuar para detectar la posición inicial de la primera mitad de k, la última mitad de la posición final k. La complejidad del tiempo de este método es la ( l o g n ) O (log n)
  • El método de la recursivos y no recursivos dos implementaciones

2, el código

  • de forma recursiva
/*
* 使用递归的方式
*/
class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.empty())
            return 0;
        int firstIndex=GetFirstIndex(data,k,0,data.size()-1);
        int lastIndex=GetLastIndex(data,k,0,data.size()-1);
        int count=0;
        if(firstIndex>-1 && lastIndex>-1)
            count=lastIndex-firstIndex+1;
        return count;
    }
    // 寻找第第一个k的下标
    int GetFirstIndex(vector<int> &data,int k,int start,int end)
    {
        if(start>end)
            return -1;
        
        int mid=start+(end-start)/2;
        if(data[mid]==k)
        {
            if((mid>start && data[mid-1]!=k) || mid==start)
                return mid;
            else
                end=mid-1;
        }
        else if(data[mid]>k)
        {
            end=mid-1;
        }
        else
            start=mid+1;
        return GetFirstIndex(data,k,start,end);
    }
    // 寻找第二个k的下标
    int GetLastIndex(vector<int> &data,int k,int start,int end)
    {
        if(start>end)
            return -1;
        
        int mid=start+(end-start)/2;
        if(data[mid]==k)
        {
            if((mid<end && data[mid+1]!=k) || mid==end)
                return mid;
            else
                start=mid+1;
        }
        else if(data[mid]>k)
        {
            end=mid-1;
        }
        else
            start=mid+1;
        return GetLastIndex(data,k,start,end);
    }
};
  • de manera no recursiva
class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.empty())
            return 0;
        int firstIndex=GetFirstIndex(data,k,0,data.size()-1);
        int lastIndex=GetLastIndex(data,k,0,data.size()-1);
        int count=0;
        if(firstIndex>-1 && lastIndex>-1)
            count=lastIndex-firstIndex+1;
        return count;
    }
    // 寻找第第一个k的下标
    int GetFirstIndex(vector<int> &data,int k,int start,int end)
    {
        //初始中间位置,必须放在循环之外
        int mid=start+(end-start)/2; 
        // 循环条件不可漏掉 start=end 的情况
        while(start<=end)
        {
            if(data[mid]>k)
            {
                end=mid-1;
            }
            else if(data[mid]<k)
            {
                start=mid+1;
            }
            else
            {
                if((mid>start && data[mid-1]!=k)||mid==start)
                {
                    return mid;
                }
                else
                {
                    end=mid-1;
                }
            }
            mid=start+(end-start)/2; //更新中间的位置
        }
        return -1;
    }
    // 寻找第二个k的下标
    int GetLastIndex(vector<int> &data,int k,int start,int end)
    {
        int mid=start+(end-start)/2;
        while(start<=end)
        {
            if(data[mid]>k)
            {
                end=mid-1;
            }
            else if(data[mid]<k)
            {
                start=mid+1;
            }
            else
            {
                if((mid<end && data[mid+1]!=k)||mid==end)
                {
                    return mid;
                }
                else
                {
                    start=mid+1;
                }
            }
            mid=start+(end-start)/2;
        }
        return -1;
    }
};
Método 3: Utilice el mutiple contenedor STL
class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.empty())
            return 0;
        multiset<int> mp;
        for(auto &i:data)
        {
            mp.insert(i);
        }
        return mp.count(k);
    }
};
Publicados 213 artículos originales · ganado elogios 48 · vistas 110 000 +

Supongo que te gusta

Origin blog.csdn.net/Jeffxu_lib/article/details/104869804
Recomendado
Clasificación