pergunta diária leetcode - 169. maioria dos elementos (entrevista clássica 150 perguntas)

1. Descrição e requisitos do tópico

169. A maioria dos elementos - LeetCode

descrição do tópico

Dado um array nums de tamanho n, retorne a maioria dos elementos nele. Um elemento majoritário é um elemento que ocorre mais de ⌊ n/2 ⌋ no array.

Você pode assumir que as matrizes não estão vazias e que sempre há uma maioria de elementos em uma determinada matriz.

exemplo

Exemplo 1:

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

Exemplo 2:

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

dica

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

2. Ideias para resolução de problemas

Ideia geral:

       Primeiro entenda os requisitos do tópico. O tópico é bem simples. É achar os elementos (maioria dos elementos) que aparecem a mais de n/2 no array, então só precisamos percorrer todo o array, contar o número de ocorrências de cada elemento por vez e, em seguida, conte-os. Compare com n/2, modifique o resultado final e retorne. A ideia geral é muito simples e também é muito simples de implementar.

        De acordo com o método de raciocínio acima, usamos loops for aninhados diretamente para contar o número de ocorrências de cada elemento e compará-los para obter o resultado final. Pode-se ver que a complexidade de tempo desse método é O(n²). Quando há muitos elementos na matriz, ocorrerá um timeout.situação, então podemos pensar em como otimizar o código para que ele use apenas uma camada do loop for para reduzir a complexidade de tempo para O(n).

       Em primeiro lugar, essa camada do loop for também deve percorrer todo o array e é usada para contar o número de ocorrências, o que equivale à função da segunda camada do loop for no método do loop aninhado, então como podemos escolher a matriz na matriz? Para comparar elementos com outros elementos na matriz, ou seja, usar uma variável auxiliar para atribuir o primeiro elemento da matriz a ela e usá-la como uma entrada para comparar com outros elementos na matriz. Se forem encontrados elementos iguais, então O número de vezes conta++, se não for igual, o número de vezes conta--. Quando contagem<0, significa que o elemento auxiliar não é um elemento majoritário neste momento, pois existe outro cuja frequência de ocorrência é maior que ela, então a variável auxiliar é atualizada para o elemento que está sendo comparado no momento. Em seguida, repita os passos acima.

Etapas específicas:

① Defina o resultado e a contagem das variáveis ​​auxiliares e atribua valores iniciais

②Atravesse o array para contar o número de ocorrências de elementos

③ Retorne o resultado final


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

① Loop aninhado [complexidade de tempo limite 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;
}

②Otimização① [Complexidade de tempo 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;
}

Acho que você gosta

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