7
votes

Vérification si 2 numéros de tableau s'ajoutent à i

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.

Tous les indices?

La complexité du temps devrait être moins


0 commentaires

15 Réponses :


7
votes
  1. Trier le tableau
  2. pour chaque élément x dans a , effectuez une recherche binaire pour i-x . Si i-x est dans A , nous avons une solution.

    Ceci est o (nlogn) .

    Si A contient des entiers dans une plage donnée (assez petite), nous pouvons utiliser un tour pour le faire O (n) :

    1. Nous avons un tableau V . Pour chaque élément x dans a , nous incrémentons v [x] .
    2. Lorsque nous incrémentons V [x] Nous vérifions également si v [i-x] est > 0 . Si c'est le cas, nous avons une solution.

5 commentaires

Tri du tableau en utilisant quel algorithme


Vous pouvez également jeter tous les éléments plus grands que i -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



0
votes

pour nlogn : triez la matrice et pour chaque élément [0 <= j , soustraire ia [j] et Faites une recherche binaire de cet élément dans le tableau de tri.

hashmap (fréquence de non, nombre) devrait fonctionner dans o (n) . .


0 commentaires

22
votes

Insérez les éléments dans HASHTABLE.

Lors de l'insertion x , vérifiez si i-x existe déjà. O (n) temps attendu.

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). xxx


8 commentaires

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 temps pour la matrice totale , 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"



0
votes
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

0 commentaires

8
votes

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
>>>


1 commentaires

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



8
votes

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 xxx

et vous créez un tableau comme ceci: xxx

qui (en java, c #, etc.). Pour compter les nombres entiers entre 0 et 6. xxx

Ceci vous donnera la matrice [1,1,2,0,1,1,1] . 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 comme xxx

globalement cet algorithme donne Vous O (n + k) 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 alors vous avez une solution garantie O (n) .


1 commentaires

C'est bon, mais pour des cas de bord tels que entrée = [0, 250, 500, 750, 1000] Vous aurez besoin d'un énorme tableau pour stocker les comptes. Je préférerais utiliser une table de hachage.



0
votes

Perl implémentation Pour détecter si une matrice triée contient deux entiers qui résument au nombre xxx


0 commentaires

2
votes
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

1 commentaires

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



3
votes
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;
}

0 commentaires

0
votes

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.


0 commentaires

0
votes

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);
}


0 commentaires

0
votes

Voici une solution O (n) en Java en utilisant O (n) espace supplémentaire. Cela utilise hashset pour la mettre en œuvre

http://www.dsalgo.com/unsortedtwosumtok.php


0 commentaires

0
votes

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;
}
  • Trouvez les paires li>
  • Trouvez des paires
  • Trouver des paires> x li> ul>

    Profitez et n'oubliez pas de bump si sa meilleure solution! p> p>


0 commentaires

0
votes

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


0 commentaires

0
votes

Une implémentation dans Python xxx

entrée: La liste est une liste de chiffres (A dans la question ci-dessus) ...
k est la somme (i dans la question ci-dessus) ....

Les sorties de la fonction true s'il existe une paire dans la liste dont la somme est égale à k et False sinon ...

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).

Cette implémentation prend également en charge deux cas de bord importants:

  • Numéros répétés dans la liste et
  • ne pas ajouter le même numéro deux fois.

0 commentaires