2012-12-08 11 views
5

Biorąc pod uwagę sekwencję dodatnich liczb całkowitych i liczbę całkowitą M, zwracaj pierwszą liczbę w sekwencji, która jest większa niż M (lub -1, jeśli nie istnieje) .Znajdź pierwszą liczbę większą niż podana w niesortowanej sekwencji

przykład: Sekwencja = [2, 50, 8, 9, 1], K = 3 -> powrót = 50

O (log n) dla każdego zapytania wymagane (po przetwarzania wstępnego).

myślałem o BSTS, ale biorąc pod uwagę sekwencję rosnąco chciałbym uzyskać tylko długą drogę, która nie dałaby mi O (logn) czas ...

EDIT: Używane struktura powinna być również łatwa do modyfikacji, tzn. powinna istnieć możliwość zamiany znalezionego elementu na dany i powtórzenia wyszukiwania innego M (wszystko - oprócz preprocessingu - O (logn)). I oczywiście byłoby miło, gdybym mógł zmienić "pierwszy większy" na "pierwszy mniejszy" i nie musiał zmieniać zbyt wiele w algorytmie. A jeśli to pomoże, możemy założyć, że wszystkie liczby są pozytywne i nie ma powtórzeń.

+0

można użyć wyszukiwania binarnego, jeśli liczby są posortowane. –

+0

Aktualizacja: z przykładu pierwsza jest jasna! = Najniższa. Pierwszy = pierwszy na wejściu. –

+0

Jakie dane mają wstępne przetwarzanie? Tylko sekwencja? –

Odpowiedz

10

Utwórz drugą tablicę (niech będzie to aux), gdzie dla każdego elementu i: aux[i] = max { arr[0],arr[1], ... ,arr[i]} (maksimum wszystkich elementów o indeksie j <= i w oryginalnej tablicy).

Łatwo zauważyć, że ta tablica jest sortowana według natury, a prosty binary search na aux przyniesie potrzebny indeks. (Łatwo jest uzyskać za pomocą wyszukiwania binarnego pierwszy element, który jest większy niż żądany element, jeśli element nie istnieje).

Złożoność czasowa to wstępne przetwarzanie O(n) (wykonywane tylko raz) i O(logn) dla zapytania.

+1

+1. Zauważ, że możesz usunąć duplikaty z tablicy 'aux' w' O (n) '. Pomoże to w przeciętnym przypadku. –

+1

Ładne rozwiązanie. Warto dodać wyjaśnienie, jak osiągnąć 'O (n)' do przetwarzania wstępnego – SomeWittyUsername

+0

@icepack: Trivial Wierzę, że: currMax = -INFINITY; for (int i = 0; i amit

Powiązane problemy