Die nachweisbar beste Lösung ist assymptotisch linear O (n) bis zu konstanten Faktoren. Dies bedeutet, dass die benötigte Zeit proportional zur Anzahl der Elemente im Array ist (was natürlich das Beste ist, was wir tun können, da wir zumindest jedes Element des Arrays lesen müssen, das bereits O (n.) benötigt) Zeit).
ist hier eine solche O (n) Lösung (die auch O (1) Raum verwendet, wenn die Liste kann in-place geändert werden):
int mindiff(const vector<int>& v)
{
IntRadixSort(v.begin(), v.end());
int best = MAX_INT;
for (int i = 0; i < v.size()-1; i++)
{
int diff = abs(v[i]-v[i+1]);
if (diff < best)
best = diff;
}
return best;
}
IntRadixSort einer linearen Zeit ist fester Breite integer Sortier Algorithmus definiert hier:
http://en.wikipedia.org/wiki/Radix_sort
Das Konzept ist, dass Sie die Fest Bitbreite Natur ints nutzen, indem sie in einer Reihe von festen Pässe auf den Bit-Positionen partitionieren. dh partitioniere sie auf dem hi-Bit (32nd), dann auf dem nächsthöheren (31.), dann auf dem nächsten (30.) und so weiter - was nur lineare Zeit benötigt.
Sie 2 fors nicht brauchen. Finden Sie 'max' und' min' und 'max-min' erhalten Sie maximale Differenz. – kirilloid
Wäre es nicht einfacher, das Array zu sortieren und die beiden nächsten benachbarten Werte zu finden? – ildjarn
Ja. Es gibt.Aber da es wie Hausaufgaben aussieht, ist es besser, für sich selbst zu denken. – MajesticRa