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;
}