2016-07-12 18 views
11

Gegeben ein Array, für jedes Element muss ich das kleinste Element auf der rechten Seite des gegebenen Elements finden, das größer als das aktuelle Element ist.Finden Sie das nächste größere Element in einem Array

Mathematisch Für jeden Index i in Array A, ich brauche Index j so dass

A[j] > A[i] 
j > i 
A[j] - A[i] is minimum 

I ji

Die Brute-Force-Lösung für jeden Index wäre zu finden Nötige zu finden, O(n^2) und ich hoffe, es besser zu machen. Ich denke, dass eine O(n log n) Lösung mit selbstausgleichenden BST möglich ist, aber das scheint ziemlich komplex. Außerdem brauche ich eine O(n) Lösung.

Gibt es eine O(n) Lösung für dieses Problem? Gibt es einen Beweis, dass die untere Grenze O(n log n) ist?

+0

Sie müssen für jeden Index finden? Oder nur ein bestimmter Index? –

+0

Also ist der Eingang "A" und "i", der gewünschte Ausgang ist "j", s.t. die angegebenen Bedingungen gelten? – Nicolas

+1

Ich brauche es für alle Indizes .. Nicht nur eine. Der Eingang ist '' A'' und der Ausgang ist ein Array '' B'' mit '' '' für alle Indizes '' i'' –

Antwort

9

Nachweis von O (n log n) untere Schranke: (zum Vergleich basierte Algorithmen)

Lets sagen, dass wir einen Vergleich basierten Algorithmus, der diese Aufgabe in O erreichen würde (n). Das heißt, für jeden Index haben wir das unmittelbar größere Element zu seiner Rechten (sagen wir R [i]).

In ähnlicher Weise können wir diesen Algorithmus auf dem umgekehrten Eingabearray ausführen und dann das Ergebnis umkehren. Für jeden Index haben wir das unmittelbar größere Element zu seiner Linken (sagen wir L [i]).

Das bedeutet, dass wir in O (n) für jedes Element das unmittelbar größere Element im Array = min (R [i], L [i]) haben.

Wir können jetzt das Array mit diesen Informationen sortieren.

Suchen Sie das minimale Element im Array. Finden Sie den Nachfolger (unmittelbares größeres Element), dann den Nachfolger des Nachfolgers usw. Damit hätten Sie das gesamte Array in sortierter Reihenfolge erhalten.

Sortierte das Array in O (n) nur mit Vergleichen (ein Widerspruch).

O (n log n) Algorithmus:
Starten der ausgeglichene BST von rechts der Anordnung aufzubauen. Die Knoten würden die Werte und die entsprechenden Indizes enthalten.

Dann würde für jedes neue gefundene Element das Einfügen in die BST den entsprechenden nächstgrößeren Index/Wert erhalten.

+0

Wir können nicht vollständig auf der Grundlage genau sortieren, wie Sie beschrieben haben. Wir haben nur ein größeres Element rechts, nicht insgesamt. Können Sie bitte klarstellen? –

+1

@AkashdeepSaluja Wir finden das unmittelbar größere Element zu seiner Rechten (sagen wir R [i]). Ähnlich können wir das unmittelbar größere Element zu seiner Linken finden (sagen wir L [i]), indem wir diesen Algorithmus rückwärts laufen lassen. Dies bedeutet, dass sofort größeres Element = min (R [i], L [i]) haben. –

+0

Man könnte auch einen 'O (n log n) 'Algorithmus erhalten, indem man einen Typ erzeugt, der den Wert und den Index im ursprünglichen Array enthält und diese nach dem Wert sortiert. – Codor