Interviewpuzzle: Array size-n enthält Zahlen aus [i, i + n]

8

Geben Sie bei einem unsortierten Array von Zahlen eine Funktion an, die true zurückgibt, wenn Array aus fortlaufenden Zahlen besteht.

Beispiele:

  1. Wenn Array {5, 2, 3, 1, 4} ist, sollte die Funktion true zurückgeben, da das Array fortlaufende Zahlen von 1 bis 5 hat.

  2. Wenn das Array {83, 78, 80, 81, 79, 82} ist, sollte die Funktion true zurückgeben, da das Array fortlaufende Zahlen von 78 bis 83 hat.

  3. Wenn das Array {34, 23, 52, 12, 3} ist, sollte die Funktion false zurückgeben, weil die Elemente nicht aufeinander folgen.

  4. Wenn das Array {7, 6, 5, 5, 3, 4} ist, sollte die Funktion false zurückgeben, weil 5 und 5 nicht aufeinander folgen.

Ich habe folgendes Algo gefunden:

  1. finde das Maximum und Minimum des Arrays

  2. max-min + 1 sollte die Größe eines Arrays haben

  3. Suche nach Duplikaten

  4. Suche nach allen fortlaufenden Nummern zwischen

Wie erreiche ich den 4. Pfad? (Die Komplexität sollte O(n) sein)

Andere Vorschläge sind sehr willkommen.

    
garima 24.03.2011, 18:05
quelle

8 Antworten

18

Wenn das Eingabearray A ist:

  1. Finden Sie die minimalen und maximalen Werte von A, geben Sie False zurück, wenn das Array die falsche Größe hat.

  2. Erstellen Sie ein neues Array, B, der gleichen Größe, anfangs mit allen Nullen

  3. Geben Sie für jeden Index i B [A [i] - min] = 1 an.

  4. Überprüfen Sie, ob B noch Nullen enthält.

Jeder Schritt benötigt O (n) Zeit.

    
Seth 24.03.2011, 18:11
quelle
2
%Vor%

Das sollte in Ordnung sein. visited [] zeigt an, wie oft eine Zahl aus dem ursprünglichen Array angezeigt wurde. Wenn eines seiner Elemente größer als zwei ist, gibt es ein Duplikat, also gib false zurück; Da die Größe beider Arrays max-min + 1 am Ende der Schleife ist, ist visit [] voll, weil wir alle Elemente von array [] besucht haben. Es ist also leer, es muss irgendwo ein Duplikat sein, aber wir müssen uns nicht darum kümmern, weil wir zu diesem Zeitpunkt immer noch falsch sind.

    
BlackBear 24.03.2011 18:15
quelle
2
%Vor%     
Fred Foo 24.03.2011 18:15
quelle
2

Es scheint mir, dass dies in O (n) Zeit mit O (1) zusätzlichem Raum geschehen kann.

Bestimmen Sie min und max des Arrays. Wenn (max - min + 1)! = N, gebe false zurück.

Ziehen Sie min von jedem Element im Array ab. Wir haben nun ein Array mit n Elementen aus dem Bereich [0, n]. Wir müssen jetzt nur nach Duplikaten suchen. Dies kann in linearer Zeit (jedes Element wird höchstens einmal verschoben) durch einen Code wie den folgenden erfolgen:

%Vor%     
user515430 24.03.2011 21:22
quelle
0

Ich bin nicht gut in C, aber musst du Schritt 4 machen? Wenn 2 wahr ist und es keine Duplikate gibt, dann enthält es sicher die Sequenz, sonst nicht?

    
Dean Barnes 24.03.2011 18:08
quelle
0

Wie von Ihnen gefragt, wird der vierte Schritt in Ihrem Algorithmus überhaupt nicht benötigt (da # 2 und # 3 garantieren, dass sie fortlaufend sind)

Wir können viele weitere Vergleiche (um die Zeitkomplexität zu verbessern) des Algorithmus speichern, indem wir alle Schritte in einem einzigen Durchlauf ausführen:

%Vor%     
pankiii 22.05.2011 11:58
quelle
-2

Hier ist etwas, das für 1..N funktioniert, Sie können einfach die arithemtische Reihe forumulae verwenden, um sich darauf einzustellen [i, i + n]

%Vor%     
lateralpunk 31.03.2012 17:38
quelle
-2

Finde min Element, Max Element und Summe der Elemente im Array.

Sie bilden eine Arthematische Progression und die Summe der Elemente ist: (no.Of element / 2) * (2 * minElement + (n-1) * difference)

Unterschied ist in diesem Fall 1

falls sum == (array.length / 2) * (2 * minElement + (array.length-1) * 1) & amp; & amp; maxElement == (minElement + (Länge von Array-1) * 1)

Dann sind die Zahlen aufeinander folgend.

Es gibt keine zusätzliche Platzkomplexität und die Zeitkomplexität ist O (n)

Danke @jpalecek für die Korrektur. Dies sollte jetzt in Ordnung sein

    
Tejas 15.05.2012 10:58
quelle

Tags und Links