J'ai vu une question d'entrevue comme suit: Donnez un tableau non formé d'entiers A et et un entier I, découvrez si deux membres d'un Ajout à I. P>
Tous les indices? P>
La complexité du temps devrait être moins p>
15 Réponses :
x code> dans a code>, effectuez une recherche binaire pour i-x code>. Si i-x code> est dans A code>, nous avons une solution. Li>
ol>
Ceci est o (nlogn) code>. p>
Si A code> contient des entiers dans une plage donnée (assez petite), nous pouvons utiliser un tour pour le faire O (n) code>: p>
- Nous avons un tableau
V code>. Pour chaque élément x code> dans a code>, nous incrémentons v [x] code>. Li>
- Lorsque nous incrémentons
V [x] code> Nous vérifions également si v [i-x] code> est > 0 code>. Si c'est le cas, nous avons une solution. LI>
ol>
Tri du tableau en utilisant quel algorithme
Vous pouvez également jeter tous les éléments plus grands que i code> -1 tout en triant le tableau pour effectuer la recherche plus rapide, bien que le pire des cas est identique.
@Yankee Heapsort, Mergesort, Quicksort (pas le pire cas O (n * journal n))
@Dan: Vous ne pouvez pas faire cela, car il peut y avoir des entiers négatifs dans la liste. Integer négatif + entier> Je peux bien ajouter Ti I.
Après avoir trié, la meilleure façon est d'avoir 1 pointeur à chaque extrémité et de les déplacer vers l'intérieur. Regardez la solution d'Aryabhatta
pour hashmap nlogn code>: triez la matrice et pour chaque élément [0 <= j ia [j] code> et Faites une recherche binaire de cet élément dans le tableau de tri. p>
(fréquence de non, nombre) code> devrait fonctionner dans o (n) code>. p>.
Insérez les éléments dans HASHTABLE.
Lors de l'insertion Sinon, triez la matrice ascendante (de l'index 0 à N-1). Avoir deux pointeurs, un à max et un à min (appelez-les m et m respectivement). P> x code>, vérifiez si i-x code> existe déjà. O (n) code> temps attendu. p>
HashMap a de très bonnes meilleures performances de cas. Mais dans le pire des cas (chaque nombre produisant le même hachage), vous ne l'aimerez pas.
@yankee: Pouvez-vous me dire le nom d'une bibliothèque qui possède une mise en œuvre existante et pragmatique d'une table de hachage qui produit la même valeur de hachage à chaque fois?
@Moron: "Tout en insérant X, vérifiez si I-X existe déjà." peut effectivement être O (log n) -Pour une instance avec une simple dichotomie, ou un arbre de recherche binaire auto-équilibré.
@Eol: Ce sera O (logn) pour chaque numéro que vous insérez, donc pour n chiffres O (nlogn) ... c'est comme trier tout en insérant.
@Yochal: Exactement! La réponse lit actuellement "O (n)" (évidemment pour une insertion unique, sinon elle serait trop optimiste, dans le cas général): Mon point était qu'il était possible de faire mieux.
@Eol: c'est o (n) attendu i> temps pour la matrice totale i>, pas seulement un élément.
Souffle pour la simplicité de la 2e solution. Merci!
Ces deux solutions sont meilleures et plus générales que la solution "acceptée"
for each ele in the array
if (sum - ele) is hashed and hashed value is not equal to index of ele
print ele, sum-ele
end-if
Hash ele as key and index as value
end-for
Par exemple, boucle et ajoutez le nombre possible de régler ou de hachage et s'il est trouvé, renvoyez-le simplement.
>>> A = [11,3,2,9,12,15] >>> I = 14 >>> S = set() >>> for x in A: ... if x in S: ... print I-x, x ... S.add(I-x) ... 11 3 2 12 >>>
C'est O (n). x en S est O (1), S.Ajoud (IX) est O (1), le pire des cas étant O (n) - wiki.python.org/moin/timecomplexity
Si vous avez la gamme que les entiers sont à l'intérieur, vous pouvez utiliser une solution de type de type à compter dans laquelle vous numérisez sur la matrice et comptez un tableau. Ex vous avez les entiers et vous créez un tableau comme ceci: p> qui (en java, c #, etc.). Pour compter les nombres entiers entre 0 et 6. p> Ceci vous donnera la matrice globalement cet algorithme donne Vous [1,1,2,0,1,1,1] code >. Maintenant, vous pouvez numériser sur ce tableau (la moitié de celui-ci) et vérifier s'il existe des entiers qui ajoute jusqu'à i code> comme p> O (n + k) code> où n est à partir de la numérisation sur l'entrée de la longueur N et K est la numérisation sur le réseau de comptage de longueur K (entiers entre 0 et K - 1). Cela signifie que si n> k code> alors vous avez une solution garantie O (n) code>. P> p>
C'est bon, mais pour des cas de bord tels que entrée = [0, 250, 500, 750, 1000] code> Vous aurez besoin d'un énorme tableau pour stocker les comptes. Je préférerais utiliser une table de hachage.
Perl implémentation Pour détecter si une matrice triée contient deux entiers qui résument au nombre fort>
O(n) time and O(1) space
If the array is sorted there is a solution in O(n) time complexity.Suppose are array is
array = {0, 1, 3, 5, 8, 10, 14}And our x1 + x2 = k = 13, so output should be= 5, 8
Take two pointers one at start of array, one at end of array
Add both the elements at ptr1 and ptr2
array[ptr1] + array[ptr2]
if sum > k then decrement ptr2 else increment ptr1
Repeat step2 and step3 till ptr1 != ptr2
Same thing explained in detail here. Seems like an Amazon interview Question
http://inder-gnu.blogspot.com/2007/10/find-two-nos-in-array-whose-sum-x.html
Oups .. Lisez la question de la question! pensé, il a été trié. Mais de toute façon conserver la réponse puisqu'elle est en contexte
public static boolean findSum2(int[] a, int sum) {
if (a.length == 0) {
return false;
}
Arrays.sort(a);
int i = 0;
int j = a.length - 1;
while (i < j) {
int tmp = a[i] + a[j];
if (tmp == sum) {
System.out.println(a[i] + "+" + a[j] + "=" + sum);
return true;
} else if (tmp > sum) {
j--;
} else {
i++;
}
}
return false;
}
Cela pourrait être possible de la manière suivante: Avant de mettre les éléments dans le hashmap, vous pouvez vérifier si l'élément est supérieur à la somme requise. Si tel est le cas, vous pouvez simplement ignorer cet élément, sinon vous pouvez continuer à la mettre dans le hashmap. C'est une légère amélioration de votre algorithme, bien que le temps total reste toujours le même. P>
Ceci peut être résolu à l'aide de l'algorithme de l'Union-Trouver, qui peut vérifier en temps constant si un élément est dans un ensemble.
Donc, l'algorithme serait donc: P>
foundsum0 = false;
foreach (el: array) {
if find (-x): foundsum0 = true;
else union (x);
}
Voici une solution O (n) en Java en utilisant O (n) espace supplémentaire. Cela utilise hashset pour la mettre en œuvre p>
Voici une solution Sorcière prend en compte les entrées en double. Il est écrit en JavaScript et suppose que la matrice est triée. La solution s'exécute dans O (n) temps et n'utilise aucune mémoire supplémentaire à partir de variables. Choisissez un algorithme de tri de choix. (RADIX O (kN)!) puis exécutez le tableau à travers ce bébé.
var count_pairs = function(_arr,x) {
if(!x) x = 0;
var pairs = 0;
var i = 0;
var k = _arr.length-1;
if((k+1)<2) return pairs;
var halfX = x/2;
while(i<k) {
var curK = _arr[k];
var curI = _arr[i];
var pairsThisLoop = 0;
if(curK+curI==x) {
// if midpoint and equal find combinations
if(curK==curI) {
var comb = 1;
while(--k>=i) pairs+=(comb++);
break;
}
// count pair and k duplicates
pairsThisLoop++;
while(_arr[--k]==curK) pairsThisLoop++;
// add k side pairs to running total for every i side pair found
pairs+=pairsThisLoop;
while(_arr[++i]==curI) pairs+=pairsThisLoop;
} else {
// if we are at a mid point
if(curK==curI) break;
var distK = Math.abs(halfX-curK);
var distI = Math.abs(halfX-curI);
if(distI > distK) while(_arr[++i]==curI);
else while(_arr[--k]==curK);
}
}
return pairs;
}
Profitez et n'oubliez pas de bump si sa meilleure solution! p> p>
diviser le tableau en deux groupes <= i / 2 et> i / 2. Puis divisez-les en <= i / 4,> i / 4 et <= 3i / 4,> 3i / 4 Et répéter pour le journal (i) étapes et vérifiez les paires de jointures de l'extérieur E.g 1i / 8 <= et> 7i / 8 et si elles contiennent tous les deux au moins un élément, ils ajoutent à I. Cela prendra n.log (i) + n / 2 étapes et pour i
Une implémentation dans Python entrée:
La liste est une liste de chiffres (A dans la question ci-dessus) ... Les sorties de la fonction true strong> s'il existe une paire dans la liste dont la somme est égale à k et J'utilise un dictionnaire dont la clé est l'élément de la matrice (liste) et la valeur est le nombre de ce élément (nombre de fois que cet élément est présent dans cette liste).
La complexité moyenne du temps d'exécution est O (n). P> Cette implémentation prend également en charge deux cas de bord importants: p>
k est la somme (i dans la question ci-dessus) .... p>