2016-07-14 21 views
1

Musterkoffer: a[]={1,4,2,5,10,5,4}; //output== 9
hier können wir nicht die Reihenfolge des Elements vor größerem Elemente sind Die Einschränkung kleinen erscheinen immer ändern:Finden max Unterschiedes in Array-Elemente

1<=n<=10^4 
10^-6<=a[i]<=10^-6 

Hier ist mein Code, aber es wird scheitern Bei einigen Testfällen kann jemand den Fehler in diesem Code finden. Danke.

int maxDiff(int *a,int n) 
{ 
    int MIN_value=INT_MAX; 
    int MAX_vale=INT_MIN; 
     for(int i=0;i<n;i++) { 
     MIN_value=min(MIN_value,a[i]); 
     MAX_value=max(a[i]-MIN_value,MAX_value); 
    } 
return MAX_value; 

} 
+0

Der Ausgang sollte 9, '10-1 = 9' sein. –

+0

@DevendraPratapSingh Wenn ein Benutzer Ihre Frage beantwortet, bitte auch ** akzeptieren ** seine Antwort ([Annahme von Antworten: Wie funktioniert es?] (Https://meta.stackexchange.com/questions/5234/how-does-accepting- An-Antwort-Arbeit)). Wenn nicht, geben Sie bitte an, was unbeantwortet bleibt, dies ist ein sehr wichtiger Teil von StackOverflow, vielen Dank. – Zabuza

Antwort

1

Der Fehler in der Logik dieser Linie sein muss:

MAX_value=max(a[i]-MIN_value,MAX_value); 

ein Debugger Verwenden Sie die Methode auf verschiedene Eingaben zu prüfen und verfolgen, wenn MAX_Value die Werte bekommt zugewiesen Sie es erwarten.

Sie können nur eingestellt MAX_value richtig und gibt die Differenz danach:

MAX_value=max(MAX_value,a[i]); 

Endlich:

return MAX_VALUE - MIN_VALUE; 

Beachten Sie, dass, wenn die Differenz negativ ist, dann das Array leer war.

Edit: Berechnen Sie die Differenz zwischen dem Maximalwert und dem Minimalwert auf den links des Maximalwertes (siehe Kommentare):

possibleMinValue = min(possibleMinValue,a[i]); 

oldMaxValue = MAX_value; 
MAX_value=max(MAX_value,a[i]); 

if (oldMaxValue != MAX_value) { 
    // Found a new maximal value. Thus, possibleMinValue is a valid min value 
    MIN_value = possibleMinValue; 
} 
1

Ihre Funktion falsch ist, weil, wenn sie den Minimalwert findet Am Ende des Arrays sind alle vorherigen Berechnungen der Unterschiede ungültig. Ihr Fehler ist somit in der Zeile:

MAX_value=max(a[i]-MIN_value,MAX_value); 

Ein viel besserer Weg, um dies wäre:

int maxDiff(int *a,int n) 
{ 
    if (n == 0 || n == 1) //If list is empty or has 1 element, return 0 
     return 0; 
    int MIN_value=INT_MAX; 
    int MAX_vale=INT_MIN; 
     for(int i=0;i<n;i++) { 
     MIN_value=min(MIN_value,a[i]); 
     MAX_value=max(a[i],MAX_value); 
    } 
return MAX_value - MIN_VALUE; 

} 
+0

Duplizieren Sie meine Antwort, aber +1 für das vollständige Codebeispiel. – Zabuza

0

Bei der Suche nach dem min oder max einem Arrays ist es am besten den anfänglichen max einstellen oder min bis zum ersten möglichen Ergebnis; In diesem Fall wäre es die Nummer 1 - Nummer 2. Damit wird sichergestellt, dass INT_MAX und INT_MIN nicht zu Ihrer endgültigen Antwort werden. Alternativ können Sie beim Auffinden der Min INT_MAX als Anfangswert für Ihre Min verwenden oder umgekehrt.

int findMaxDiff(int* array, int n) { 
    int max = array[i]; 
    int min = array[i]; 

    for(int i = 0; i < n; i++) { 
     if(array[i] > max) { 
      max = array[i] 
     } 
     if(array[i] < min) { 
      min = array[i] 
     } 
    } 
    return max - min; 
}