Название Описание
Число вхождений числа в массив превышает половину длины массива. Узнайте это число. Например, введите массив длиной 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;
}
}