La meilleure façon de trouver le nombre de paires dans un tableau dont la différence est k
J'ai pu résoudre le problème sur hackerrank. J'ai eu deux approches dans mon esprit :
d'entrée : tableau non trié(a) et k
Première Approche :
1) Trier le tableau
2) pour chaque élément du tableau a[i] ,trouver l'élément a[i]+K à l'aide de la recherche binaire.Si trouvé increament le comte et la rupture de la boucle interne.
Deuxième Approche :
1) Trier le tableau
2) pour chaque élément du tableau a[i] ,trouver l'élément a[i]+K à l'aide de linearsearch.Si trouvé increament le comte et la rupture de la boucle interne.
J'ai trouvé la Première approche pour être mieux comme ça permettra de résoudre le problème à n(logn). Mais lorsque plusieurs cas de test sont sur les solutions de l'approche 2 prend moins de temps . Peut quelqu'un me dire pourquoi ?
Ci-dessous sont le code pour les deux approches :
Première Approche De 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;
}
Deuxième Code D'Approche :
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;
}
OriginalL'auteur Sahil Gupta | 2013-11-24
Vous devez vous connecter pour publier un commentaire.
La première approche est le meilleur entre les deux, mais il est la meilleure approche à la fois:-
Voici un pseudo-code pour une meilleure approche:-
Temps de la complexité: O(N)
alors que votre approche = O(NlogN)
Edit:-
Remarque:- Mon approche a un espace supplémentaire de complexité de O(N) pour la table de Hachage considérant que l'approche suggérée est en place.
U est bonne je fais toujours de l'espace de l'analyse de la complexité, mais a manqué cette fois. Vérifier mon montage.
Semble bon 🙂 +1
Il n'y a pas de add() dans la table de hachage
Oui c'est pourquoi j'ai précisé c'est un pseudo-code.
OriginalL'auteur Vikram Bhat
Dans votre 1er code, votre intérieur de la boucle de résiliation condition est incorrect. Il devrait y mettre fin si la
beg
etend
pointeurs de la croix les uns des autres.Changer de
while (beg <= end)
oufor (; beg <= end; )
Aussi, pour la seconde approche, il n'est pas nécessaire pour le tri du tableau.
par votre logique qu'arriverait-il si la différence est grande?
Dans le cas où je n'utilise pas le tri pour l'approche 2 .Ensuite, j'ai besoin de chercher temp-a[j]==-k et temp-a[j]==k , donc pour cela plus ou moins le temps de complexité O(n^2). Alors que si j'trier le tableau d'abord le temps d'exécution pour plusieurs cas de test sont moins.
si vous êtes à la réalisation d'un linéaire de recherche, puis le temps de la complexité de chaque cas de test est O (n^2) si le tableau est trié.
Grâce abhishek pour les réponses 🙂
OriginalL'auteur Abhishek Bansal
Vous pouvez également utiliser set pas besoin d'utiliser la table de hachage
OriginalL'auteur fatih tekin
OriginalL'auteur Saif ali Karedia
OriginalL'auteur Deepak Maddeshiya
Ma solution
Système..println("findPair:"+findPair(new int[]{4,7,1,2,5,3,0,7,8,5,2}, 3));
OriginalL'auteur Wei-Hsuan Chou