[Массив] Числа, которые встречаются в массиве более половины раз.

Название Описание

Число вхождений числа в массив превышает половину длины массива. Узнайте это число. Например, введите массив длиной 9 {1,2,3,2,2,2,5,4,2}. Поскольку число 2 встречается в массиве 5 раз, что составляет более половины длины массива, выводится 2. Если его нет, выведите 0.


Метод сортировки

Отсортируйте массив. Если количество вхождений определенного числа превышает половину длины массива, это число должно появиться в средней позиции, а затем пройти по массиву один раз, чтобы определить, превышает ли количество вхождений половину длины массива. длина массива.

import java.util.Arrays;

public class Solution {
    
    
    public int MoreThanHalfNum_Solution(int[] array) {
    
    
        Arrays.sort(array);
        int res = array[array.length / 2];
        int count = 0;
        for (int i : array) {
    
    
            if (i == res)
                count++;
            if (count > array.length / 2)
                return res;
        }
        return 0;
    }
}

Хеширование

Используйте хеш-таблицу для хранения количества вхождений значения в массив

import java.util.ArrayList;
import java.util.HashMap;

public class Solution {
    
    
    public int MoreThanHalfNum_Solution(int[] array) {
    
    
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int len = array.length;
        for (int i = 0; i < len; i++) {
    
    
            hashMap.put(array[i], hashMap.getOrDefault(array[i], 0) + 1);
            if (hashMap.get(array[i]) > len / 2)
                return array[i];
        }
        return 0;
    }
}

Оптимальное решение

Если количество вхождений в массиве превышает половину длины массива, то количество вхождений этого числа будет превышать сумму вхождений всех других чисел. Вы можете использовать две переменные countи resзаписать количество вхождений элемент и значение элемента соответственно.Обратите внимание, что здесь количество раз не является истинным количеством вхождений элемента. Инициализация count=1, res=array[0], то через массив, и если текущие значения элементов resсовпадают, в count++противном случае count--, если count=0когда resустановлено значение текущего элемента, и count=1. Если есть элемент, который превышает половину длины массива, то последний resэлемент должен быть этим элементом, и он count>0не будет уменьшен до 0, потому что он появляется чаще, чем другие элементы массива, поэтому, конечно, это count>0не означает resчто Число вхождений превышает половину длины массива, потому что в массиве может не быть элемента, количество вхождений которого превышает половину длины массива, и он все еще может быть удовлетворен в это время count>0. Следовательно, необходимо снова пройти по массиву, чтобы определить, resпревышает ли количество вхождений половину длины массива.

import java.util.ArrayList;

public class Solution {
    
    
    public int MoreThanHalfNum_Solution(int[] array) {
    
    
        int count = 1, res = array[0];
        for (int v : array) {
    
    
            if (count == 0) {
    
    
                count = 1;
                res = v;
            }
            if (v == res)
                count++;
            else
                count--;
        }
        count = 0;
        for (int v : array) {
    
    
            if (v == res) {
    
    
                count++;
                if (count > array.length / 2)
                    return res;
            }
        }
        return 0;
    }
}

рекомендация

отblog.csdn.net/weixin_43486780/article/details/113729506