Одним простым способом было бы перебрать список, чтобы получить наибольшее значение n
, тогда вы знаете, что n+1
отсутствует в списке.
Edit:
Метод нахождения наименьшего положительного неиспользуемого числа будет начинаться с нуля и сканировать список на предмет этого числа, начиная с нуля и увеличивая его, если вы найдете число. Чтобы сделать его более эффективным и использовать высокую вероятность сортировки списка, вы можете переместить числа, которые меньше текущего, в неиспользуемую часть списка.
Этот метод использует начало списка в качестве места для хранения меньших чисел, переменная startIndex
отслеживает начало соответствующих чисел:
public static int GetSmallest(int[] items) {
int startIndex = 0;
int result = 0;
int i = 0;
while (i < items.Length) {
if (items[i] == result) {
result++;
i = startIndex;
} else {
if (items[i] < result) {
if (i != startIndex) {
int temp = items[startIndex];
items[startIndex] = items[i];
items[i] = temp;
}
startIndex++;
}
i++;
}
}
return result;
}
Я провел тест производительности, в котором я создал списки с 100000 случайных чисел от 0 до 19999, что делает среднее наименьшее число около 150. При выполнении тестов (по 1000 списков тестов в каждом) метод нашел наименьшее число в несортированных списках в среднем за 8,2 мс, а в отсортированных списках - в среднем за 0,32 мс *
(Я не проверял, в каком состоянии метод покидает список, так как он может поменять некоторые элементы в нем. По крайней мере, он покидает список, содержащий те же элементы, и по мере перемещения меньших значений вниз по списку, я думаю, что он должен становиться более сортированным для каждого поиска.)