Задачи
January 29, 2024
Часто встречаемый элемент *
Задача. Дан массив целых чисел, которые отсортированы в неубывающем порядке. Необходимо определить есть ли в массиве целое число, которое встречается более 25% случаев. Если такое число есть верните его, в противном случае верните -1.
Разбор
Существует несколько способов решения этой задачи, самый очевидный это вариант с использованием хэш-таблицы.
Мы же приведем другое элегантное решение, которое использует тот факт, что массив изначально отсортирован. А также нам известен размер подмассива элементов с одинаковым значением: Length / 4, используем это в решении.
Тогда для того, чтобы определить такой подмассив, нужно лишь проверить его концы и если они совпадают, то мы нашли его. То есть в цикле будем проверять следующее условие: arr[i] == arr[i + Length / 4].
Отдельно стоит упомянуть крайние случаи, если размер массива меньше 3. Тогда мы можем смело вернуть любой из элементов массива.
Смотрите детали реализации ниже.
Реализация
public static int FindFreqNumber(int[] arr)
{
int len = arr.Length;
if (len < 3)
{
return arr[0];
}
int size = len / 4;
for (int i = 0; i < len - size; i++)
{
if (arr[i] == arr[i + size])
{
return arr[i];
}
}
return -1;
}https://gist.github.com/unilecs/bd4ae0fc5973b70e3e77e0fcdb3484b7