Благородное число (Noble integer)

Задача. Дан целочисленный массив. Найти целое число p, если оно существует, такое, что количество элементов массива, которые больше, чем p, равно (количество таких элементов) p

Если число существует, вернуть 1, иначе вернуть -1.

Идея решения. Поскольку речь идёт об отношениях больше-меньше между всеми элементами, то имеет смысл отсортировать исходный массив.


Затем нужно просматривать каждый эелемент массива (пропуская его дубликаты) и сравнивать, сколько элементов (больше его) ещё остались до конца массива. если число оставшихся элементов равно самому (в настоящий момент рассматриваемому) элементу, то мы нашли благородное число.

public class Solution {
    public int solve(ArrayList<Integer> A) {
        // Total runtime: O(n log n) due to sort
        Collections.sort(A);
        
        for(int i = 0; i < A.size(); i++) {
            // Пропускаем все дубликаты
            if(i < A.size() - 1 && A.get(i) == A.get(i + 1)) {
                continue;
            }
            // Условие, при котором задача решена
            if(A.size() - i - 1 == A.get(i)) {
                return 1;
            }
        }
        
        return -1;
    }
}

Данный алгоритм можно ускорить, если ввести проверку:
if(A.size() - i - 1 < A.get(i)) { return -1; }
Если осталось элементов меньше, чем рассматриваемое число, мы уже ничего и не "словим" в этом массиве - можно выходить.

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком