2012-08-08 12 views
11

Dies ist ein Interview Frage:die größtmögliche Differenz in einem Array mit dem kleineren ganzzahligen früher auftretenden

Finden Sie die größtmögliche Differenz in einem Array von ganzen Zahlen, so dass die kleinere ganze Zahl früher in der Matrix auftritt.

Einschränkung: Zahlen sind nicht eindeutig. Der Bereich ist Integer-Bereich von Java. (Oder eine andere Sprache)

Beispiel:

Eingang 1: {1, 100, 2, 105, -10, 30, 100}

Der größte Unterschied zwischen -10 und 100 -> 110 (hier -10 beim 5. Index und 100 ist an den 7. index)

Eingang 2: {1, 100, 2, 105, -10, 30, 80}

der größte Unterschied zwischen 1 und 105 -> 104 (hier ist 1 am 1. Index und 105 am 4. Index)

Mögliche Lösung:

Ein Ansatz ist für alle möglichen Unterschiede zu überprüfen und verfolgen Sie den größten Unterschied bis jetzt O (n^2) Komplexität.

kann dies in besser als O (n^2) Zeit getan werden?

+0

Was die Beschränkungen sind, soweit vorhanden, in Bezug auf die zusätzlichen Platz, Komplexität? – Edmon

+0

Für Interessierte gibt es auch eine O (log n) -Lösung für jedes Sub-Array nach O (n) Vorberechnung mit Segmentbäumen. Praktisch, wenn Sie viele Fragen zum selben Datensatz beantworten müssen. https://gist.github.com/elnygren/066c5387c7d102bf36a3993b37fad525 – elnygren

Antwort

10

Start aus dem letzten Elemente und rückwärts bewegen. behalte das größte bisher aufgetretene Element im Gedächtnis. für jedes Element von der Max subtrahieren und an der jeweiligen Position speichern.

Sie können auch ein Element behalten, um die maximale Differenz zu speichern und die Ausgabe sofort zu geben. O (n) Zeit, O (1) Raum.

int max = INT_MIN; 
int maxdiff = 0; 

for (i = sizeof(arr)/sizeof(int) - 1; i >= 0; i--) { 
    if (max < arr[i]) { 
    max = arr[i]; 
    } 
    int diff = max - arr[i]; 
    if (maxdiff < diff) { 
    maxdiff = diff; 
    } 
} 

print maxdiff; 
+0

Ich habe nicht den Code, den Sie einfügen und kopieren können, habe ich die Logik gegeben. Sie können in jeder Sprache implementieren. obwohl es gegenüber cpp voreingenommen ist. siehe, es verfolgt die größte Anzahl bisher (von den letzten) und findet den Unterschied mit jedem, dynamisch aktualisiert die max (wenn es größere Max findet). und es behält auch den größten Unterschied im Auge. –

+0

Meine schlechte - gute Lösung, +1 – alfasin

+1

Ich reparierte Ihre Schleife zu sein "i -" anstelle von "i ++" - Ich hoffe, es macht Ihnen nichts aus. –

-2

Ich bin mir ziemlich sicher, dass dies Ihr Problem lösen soll:

int largestNumber = Integer.MIN_VALUE; 
    int smallestNumber = Integer.MAX_VALUE; 

    for(int i = 0; i < yourArray.Length; i++) 
    { 
     if(yourArray[i] > largestNumber) 
      largestNumber = yourArray[i]; 

     if(yourArray[i] < smallestNumber) 
      smallestNumber = yourArray[i]; 

    } 

    int biggestDifference = largestNumber - smallestNumber ; 
+2

Dies berücksichtigt nicht die kleinere früher – dvberkel

+0

Sie fehlen die "so, dass die kleinere ganze Zahl früher im Array auftritt." Teil der Frage. – Vivek

+0

Oh Entschuldigung, ich kann nicht glauben, dass ich das nicht gesehen habe. Ich war an meinem Telefon und ich muss darüber gescrollt haben. :/ – user1582511

0

Ich schlage vor, dass der größte Unterschied ist, immer zwischen der größten Anzahl und der kleinsten Zahl davor oder zwischen der kleinsten Zahl und der größten Zahl danach. Diese können in linearer Zeit bestimmt werden.

10

Dhandeeps Algorithmus ist gut und Viveks Übersetzung des Codes in Java funktioniert! Außerdem können wir auch das Array scannen normal und nicht in umgekehrter Richtung:

int seed[] = {1, 100, 2, 105, -10, 30, 100}; 
int maxDiff=Integer.MIN_VALUE, minNumber = Integer.MAX_VALUE; 

for (int i = 0; i < seed.length ; i++){ 
    if(minNumber > seed[i]) 
     minNumber = seed[i]; 

    maxDiff = Math.max(maxDiff, (seed[i]-minNumber)); 
} 
System.out.println(maxDiff); 
+2

obige Lösungen sind richtig, aber das ist intuitiver, also +1. Vielen Dank. – Trying

+0

@alfasin Ihr Code funktioniert nicht für den Fall, wenn das Seed-Array Zahlen in absteigender Reihenfolge enthält. Für ex: Wenn der Seed-Wert {4,3,2,1} ist, wird 0 anstelle von -1 zurückgegeben. Ich habe eine Änderung der Antwort vorgeschlagen, die sich um dieses Szenario kümmert; Bitte schauen Sie und akzeptieren Sie die Änderung, wenn es in Ordnung scheint. – shridharama

+0

@shridharama Die Definition enthält nicht, wie solch ein Fall behandelt werden sollte. Die Rückgabe von 0 ist so gut wie die Rückgabe von -1. – alfasin

4

Dank @Dhandeep Jain für die Antwort. Es ist die Java-Version:

//int seed[] = {1, 100, 2, 105, -10, 30, 100}; 
     int seed[] = {1, 100, 2, 105, -10, 30, 80}; 
     int maxDiff=Integer.MIN_VALUE, maxNumber = Integer.MIN_VALUE; 

     for (int i = (seed.length-1); i >=0 ; i--){ 
      if(maxNumber < seed[i]) 
       maxNumber = seed[i]; 

      maxDiff = Math.max(maxDiff, (maxNumber - seed[i])); 
     } 
     System.out.println(maxDiff); 
+0

Dieser Code druckt "0" ... – alfasin

+0

@alfasin Nein, tut es nicht. Können Sie es mit SOPs versuchen? – Vivek

+0

+1 Sie haben Recht - meine schlechte, schöne Lösung in O (n) – alfasin

0
public class Test{ 

    public static void main(String[] args){ 

     int arr1[] = {1,2,5,7,9}; 
     int arr2[] = {20,25,26,35}; 
     int diff = 0; 
     int max = 0; 

     for(int i=0;i<arr1.length;i++){ 
      for(int j=0;j<arr2.length;j++){ 

       diff = Math.abs(arr1[i]-arr2[j]); 
       if(diff > max){ 
        max = diff; 
       } 
      } 
     } 
    System.out.println(max); 
    } 
} 
+0

Wie kann diese Antwort "kann dies in besser als O (n^2) Zeit getan werden?" Wie unterscheidet es sich von "für alle möglichen prüfen Unterschiede und den größten bisher gefundenen Unterschied verfolgen? – greybeard

0
// Solution Complexity : O(n) 
    int maxDiff(int a[], int n){ 
     // Find difference of adjacent elements 
     int diff[n+1]; 
     for (int i=0; i < n-1; i++) 
      diff[i] = a[i+1] - a[i]; 

     // Now find the maximum sum sub array in diff array 
     int max_diff = diff[0]; 
     for (int i = 1 ; i < n-1 ; i++) { 
      if(diff[i-1] > 0) diff[i] += diff[i-1]; 
      if(max_diff < diff[i]) max_diff = diff[i]; 
     } 
     return max_diff; 
    } 
+0

Fehlt etwas in der Code-Liste, gibt es am Ende ein einziges '}'. –

+0

0 1 1 2 ........ – greybeard

0

zuerst die Differenz zwischen den benachbarten Elementen des Arrays finden und speichern, alle Unterschiede in einer Hilfsgruppe diff [] die Größe n-1. Jetzt werden diese Probleme zum Finden des maximalen Summen-Subarrays dieses Differenz-Arrays.

-1
public static void findDifference(Integer arr[]) { 
    int indexStart = 0; 
    int indexMin = 0; 
    int indexEnd = 1; 
    int min = arr[0]; 
    int diff = arr[1] - arr[0]; 
    for (int counter = 1; counter < arr.length; counter++) { 
     if (arr[counter] - min > diff) { 
      diff = arr[counter] - min; 
      indexEnd = counter; 
      indexStart = indexMin; 
     } 
     if (arr[counter] < min) { 
      min = arr[counter]; 
      indexMin = counter; 
     } 
    } 
    System.out.println("indexStart = " + indexStart); 
    System.out.println("indexEnd = " + indexEnd); 
    System.out.println("diff = " + diff); 
} 
+1

Wie unterscheidet sich das von [Alfasins Antwort] (http://stackoverflow.com/a/11858996/3789665)? – greybeard

0

Ruby-Lösung:

a = [3, 6, 8, 1, 5] 
min = 10**6 
max_diff = -10**6 
a.each do |x| 
    min = x if x < min 
    diff = x - min 
    max_diff = diff if diff > max_diff 
end 
puts max_diff 
Verwandte Themen