Задачи
January 29
Часто встречаемый элемент *
Задача. Дан массив целых чисел, которые отсортированы в неубывающем порядке. Необходимо определить есть ли в массиве целое число, которое встречается более 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