Благородное число (Noble integer)
Задача. Дан целочисленный массив. Найти целое число p, если оно существует, такое, что количество элементов массива, которые больше, чем p, равно (количество таких элементов) p
Если число существует, вернуть 1, иначе вернуть -1.
Идея решения. Поскольку речь идёт об отношениях больше-меньше между всеми элементами, то имеет смысл отсортировать исходный массив.
Затем нужно просматривать каждый эелемент массива (пропуская его дубликаты) и сравнивать, сколько элементов (больше его) ещё остались до конца массива. если число оставшихся элементов равно самому (в настоящий момент рассматриваемому) элементу, то мы нашли благородное число.
Данный алгоритм можно ускорить, если ввести проверку:
Если число существует, вернуть 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; }
Комментарии
Отправить комментарий