Мне было интересно, не захочет ли кто-нибудь дать мне отзыв о моем решении сегодняшнего вопроса из списка рассылки Daily Coding. Это интересный вопрос о поиске первого значения, которое НЕ присутствует в списке, в отличие от поиска значения, которое там ЕСТЬ.
Эта проблема была задана Stripe.
Учитывая массив целых чисел , найти первое пропущенное положительное целое число за линейное время и постоянное пространство. Другими словами, найдите наименьшее положительное целое число, которого нет в массиве. Массив также может содержать дубликаты и отрицательные числа.
Например, вход [3, 4, -1, 1] должен давать 2. Вход [1, 2, 0] должен давать 3.
Вы можете изменить входной массив на месте.
Мой главный вопрос в том, что я не уверен, соблюдал ли я требования времени O (n) и пространства O (1). Вот мое решение с использованием Groovy:
def find_first( Xs ) {
ys = []
szXs = Xs.size()
// First, transfer Xs list to a set ys.
szXs.times { // this loop is O(n)
if ( (hd = Xs.head()) > 0 ) { ys << hd; } // We only need to keep val if it's positive.
Xs = Xs.drop(1); // Remove val from Xs in order to meet O(1) space requirement.
}
ys = ys.toSet() // converting list to set is O(n)
sz = ys.size() // ys.size() might be same as Xs.size(), but it could be smaller, so give it a new var.
for (int i = 1; i < sz; ++i) { // this loop is O(n)
if ( !ys.contains(i) ) return i // Testing a hash set for set membership is O(1)
}
return sz + 1 // if this point is reached, ys had all values [1..sz] already
} // end find_first
def test(Xs) {
println "\nstarting with Xs = " + Xs
ans1 = find_first( Xs )
println "first missing = " + ans1
}
xs1 = [ 3,4,-1,1 ]
xs2 = [ 1, 2, 0 ]
xs3 = [ 7, 8 ]
xs4 = [ 1,1,2,1 ]
xs5 = [ -4, -1 ]
test(xs1)
test(xs2)
test(xs3)
test(xs4)
test (xs5)
И вот результат:
, начиная с Xs = [3, 4, - 1, 1] первый пропущенный = 2
начиная с Xs = [1, 2, 0] первый пропущенный = 3
начиная с Xs = [7, 8] первый пропущенный = 1
начиная с Xs = [1, 1, 2, 1] сначала отсутствует = 3
начиная с Xs = [-4, -1] сначала отсутствует = 1
Так что это правильно для этого ограниченного набора значений, просто хочу быть уверенным, что это время O (n) и пространство O (1). Любой совет приветствуется! Хэнк