Beste Weg zu finden, die Anzahl der Paare in einem array, dessen Differenz ist k
War ich der Lösung des Problems auf hackerrank. Ich hatte zwei Ansätze in meinem Kopf :
input : unsortierter array(a) und k
Erster Ansatz :
1) Sortieren Sie das array
2) für jedes array-element a[i] ,suchen Sie nach dem element a[i]+K unter Verwendung der binären Suche.Wenn gefunden increament der Graf und break die innere Schleife.
Zweiter Ansatz :
1) Sortieren Sie das array
2) für jedes array-element a[i] ,suchen Sie nach dem element a[i]+K mit linearsearch.Wenn gefunden increament der Graf und break die innere Schleife.
Fand ich den Ersten Ansatz besser zu sein, als es das problem zu lösen in n(logn). Aber wenn mehrere test-Fälle sind auf die Lösungen der Ansatz 2 nimmt weniger Zeit . Kann jemand bitte erklären, warum ?
Unten sind die Codes für die beiden Ansätze :
Ersten Ansatz Code :
static int pairs(int[] a,int k) {
/* Complete this function */
int temp;
int len=a.length;
int count=0;
int beg;
int mid;
int end;
int midVal;
Arrays.sort(a);
for(int i=0;i<len-1;i++){
temp=a[i]+k;
beg=i+1;
end=len-1;
for(int l=beg;l<len;l++){
mid=(beg+end)/2;
midVal=a[mid];
if(midVal==temp){
count++;
break;
}
else if(midVal>temp){
end=mid-1;
}
else{
beg=mid+1;
}
}
}
return count;
}
Zweite Ansatz Code :
static int pairs(int[] a,int k) {
/* Complete this function */
int temp;
int len=a.length;
int count=0;
Arrays.sort(a);
for(int i=0;i<len;i++){
temp=a[i];
for(int j=i+1;j<len;j++){
if(temp-a[j]==-k){
count++;
break;
}
}
}
return count;
}
InformationsquelleAutor Sahil Gupta | 2013-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der erste Ansatz ist der beste hier unter den beiden, aber es ist der bessere Ansatz als die beiden:-
Hier ein pseudo-code für eine bessere Lösung:-
Zeit-Komplexität: O(N)
in der Erwägung, dass Ihr Ansatz = O(NlogN)
Edit:-
Hinweis:- Mein Ansatz hat mehr Platz-Komplexität von O(N) für die Hash-Tabelle in der Erwägung, dass vorgeschlagene Ansatz ist inplace.
U Recht ich mache immer Platz-Komplexität Analyse, sondern verpasste dieser Zeit. Überprüfen Sie meine zu Bearbeiten.
Sieht gut aus 🙂 +1
Es gibt keine add() in HashMap
Ja, dass ist der Grund, warum ich angegeben haben, ist es eine pseudo-code.
InformationsquelleAutor Vikram Bhat
In deinem 1. code, deine innere Schleife, Abbruchbedingung ist falsch. Es sollte zu kündigen, wenn der
beg
undend
Zeiger kreuzen.Ändern
while (beg <= end)
oderfor (; beg <= end; )
Auch für den zweiten Ansatz gibt es keine Notwendigkeit für die Sortierung des Arrays.
durch Ihre Logik, was passieren würde, wenn die Differenz groß ist?
Falls ich das nicht mit dem Sortieren für Ansatz 2 .Dann muss ich suchen-temp - -a[j]==-k und temp-a[j]==k , so dass für diesen mehr oder weniger die Zeit-Komplexität O(n^2). Während, wenn ich Sortiere das array zuerst die Laufzeit für mehrere Testfälle werden weniger.
wenn Sie die Durchführung einer linearen Suche, dann die Zeit-Komplexität für jeden Testfall werden O (n^2), ob das array sortiert ist.
Danke abhishek für die Antworten 🙂
InformationsquelleAutor Abhishek Bansal
Können Sie auch verwenden, legen Sie keine Notwendigkeit zu verwenden hashmap
InformationsquelleAutor fatih tekin
InformationsquelleAutor Saif ali Karedia
InformationsquelleAutor Deepak Maddeshiya
Meine Lösung
System.aus.println("findPair:"+findPair(new int[]{4,7,1,2,5,3,0,7,8,5,2}, 3));
InformationsquelleAutor Wei-Hsuan Chou