leetcode pregunta diaria - 169. la mayoría de los elementos (entrevista clásica 150 preguntas)

1. Descripción del tema y requisitos

169. La mayoría de los elementos - LeetCode

Tema Descripción

Dada una matriz nums de tamaño n, devuelve la mayoría de los elementos que contiene. Un elemento mayoritario es un elemento que ocurre más de ⌊ n/2 ⌋ en la matriz.

Puede suponer que las matrices no están vacías y que siempre hay una mayoría de elementos en una matriz determinada.

ejemplo

Ejemplo 1:

输入:nums = [3,2,3]
输出:3

Ejemplo 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

pista

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

2. Ideas para resolver problemas

Idea general:

       Primero comprenda los requisitos del tema. El tema es muy simple. Es encontrar los elementos (la mayoría de los elementos) que aparecen más de n/2 en la matriz, por lo que solo necesitamos recorrer toda la matriz, contar el número de ocurrencias de cada elemento a su vez, y luego contarlos. Comparar con n/2, modificar el resultado final y regresar. La idea general es muy simple, y también es muy simple de implementar.

        De acuerdo con el método de pensamiento anterior, usamos directamente bucles for anidados para contar el número de ocurrencias de cada elemento y compararlos para obtener el resultado final. Se puede ver que la complejidad temporal de este método es O(n²). hay demasiados elementos en la matriz, se producirá una situación de tiempo de espera, por lo que podemos pensar en cómo optimizar el código para que solo use una capa del bucle for para reducir la complejidad del tiempo a O(n).

       En primer lugar, esta capa del bucle for también debe atravesar toda la matriz y se utiliza para contar el número de ocurrencias, lo que equivale a la función de la segunda capa del bucle for en el método de bucle anidado. elegir la matriz en la matriz Para comparar elementos con otros elementos en la matriz, es decir, usar una variable auxiliar para asignarle el primer elemento de la matriz y usarla como una entrada para comparar con otros elementos en la matriz. Si se encuentran elementos iguales, entonces el número de veces cuenta++, si no es igual, el número de veces cuenta--. Cuando count<0, significa que el elemento auxiliar no es un elemento mayoritario en este momento, porque hay otro cuya frecuencia de ocurrencia es mayor que él, por lo que la variable auxiliar se actualiza al elemento que se está comparando actualmente. Luego repita los pasos anteriores.

Pasos específicos:

① Definir resultado y conteo de variables auxiliares, y asignar valores iniciales

② Recorra la matriz para contar el número de ocurrencias de elementos

③ Devolver el resultado final resultado


3. Código específico [lenguaje C]

① Bucle anidado [complejidad de tiempo de espera O(n²)]

int majorityElement(int* nums, int numsSize) {
    int result = 0;
    int count;
    for (int i = 0; i < numsSize; i++) {
        count = 1;
        for (int j = 0; j < numsSize; j++) {
            if (j != i) {
                if (nums[i] == nums[j]) {
                    count++;
                }
            }
        }
        if (count > (numsSize / 2)) {
            result = nums[i];
        }
    }
    return result;
}

②Optimización① [Complejidad de tiempo O(n)]

int majorityElement(int* nums, int numsSize){
    int result=nums[0];
    int count=1;
    for(int i=1;i<numsSize;i++){
        if(nums[i]==result){ //找到相等的,次数增加
            count++;
        }
        else//不相等,次数减少
        {
            count--;
            if(count<0)//该元素不是多数元素,更新次数与结果
            {
                result=nums[i];
                count=1;
            }
        }
    }
    return result;
}

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/131528517
Recomendado
Clasificación