Q39 El número de ocurrencias en la matriz excede la mitad

Más de la mitad de las ocurrencias en la matriz.

Titulo

Hay un número en la matriz que aparece más de la mitad de la longitud de la matriz. Encuentre este número. Por ejemplo, ingrese una matriz de longitud {1,2,3,2,2,2,5,4,2}. Dado que el número 2 aparece en la matriz 5 veces, más de la mitad de la longitud de la matriz, por lo tanto, la salida 2. Si no existe, salida 0.

Ideas

Idea 1

Premisa importante: si un número repite más de la mitad de la longitud de la matriz, el número medio de la matriz debe ser el número repetido.

Por lo tanto, puede tener las siguientes ideas:

  1. Use la función de partición de clasificación rápida para encontrar continuamente el pivote en la mediana de la matriz.
    1. Si el índice devuelto por la partición está a la izquierda del medio, continúe buscando en [index + 1, derecha]
    2. Si el índice devuelto por la partición está a la derecha del medio, continúe buscando en [left, index-1]
    3. index == mid, return
  2. Si el pivote se repite más de media vez en la matriz, la salida,
  3. De lo contrario, la salida es ninguna.

Idea 2

Hay otra idea:

La misma figura compensa la idea.

Mantener un número actual t y el número actual de veces n.

  1. Durante la inicialización, t es arr [0], n = 1
  2. Continúe bajando, si arr [i] es lo mismo que t, entonces n + 1, si no, n-1
  3. Si n == 0, entonces t se convierte en el número, n + 1

Fin:

  • Si un cierto número de veces excede la mitad, lo último que queda es definitivamente eso.
  • Las cifras dadas al final deben ser juzgadas. Iterar nuevamente para verificar.

Lograr

Hay dos errores al programar:

  1. left = pIndex + 1; y right = pIndex-1 ;, no hubo incremento ni disminución de 1 en ese momento, lo que causó un bucle continuo y el pIndex permaneció sin cambios.
  2. si (veces <= mediados) no suma o igual, lo que resulta en una matriz de tamaño 9, cuando el número repetido es 4, no existe ningún retorno. La mejor forma de escribirlo debe ser veces * 2> longitud.
//思路1实现
class Solution {
public:
    int partition(vector<int>& numbers, int left, int right)
    {
        if(numbers.empty() || left<0 || right>=numbers.size() || left>right)
            return -1;
        int pivot = numbers[left];
        while(left<right)
        {
            while(left<right && numbers[right]>=pivot)
                --right;
            numbers[left] = numbers[right];
            while(left<right && numbers[left]<=pivot)
                ++left;
            numbers[right] = numbers[left];
        }
        numbers[left] = pivot;
        return left;
    }
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int length = numbers.size();
        if(length==0) return 0;
        int left = 0;
        int right = length-1;
        int mid = length/2;
        int pIndex = partition(numbers, left, right);
        while(pIndex!=mid)
        {
            if(pIndex<mid)
            {
                left = pIndex+1;  //注意这里要加1
                pIndex = partition(numbers, left, right);
            }
            else
            {
                right = pIndex-1; //注意这里要改变
                pIndex = partition(numbers, left, right);
            }
        }
        int targetNum = numbers[pIndex];
        int times = 0;
        for(auto t : numbers)
        {
            if(t == targetNum)
                ++times;
        }
        if(times<=mid) //注意临界值判断,其实 if(!(2*times>length))更直观
            return 0;
        return targetNum;
    }
};
//思路2实现
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty()) return 0;
        int target = numbers.front();
        int n = 1;
        for(int i=1; i<numbers.size(); ++i)
        {
            if(n==0)
            {
                target = numbers[i];
                ++n;
            }
            else
            {
                if(target == numbers[i])
                    ++n;
                else
                    --n;
            }
        }
        if(n<=0)
            return 0;
        int times = 0;
        for(auto val:numbers)
        {
            if(val == target)
                ++times;
        }
        if(2*times>numbers.size())
            return target;
        else
            return 0;            
    }
};
58 artículos originales publicados · ganó 11 · 30,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/mhywoniu/article/details/105606266
Recomendado
Clasificación