2010-06-10 3 views

Répondre

2

Voici quelque peu clarifié la solution de Graphics Noob. De plus, c'est plus comme O (N) (en supposant que le hachage ne nous manquera pas), pas O (N * log (N)).

Result findMultiplicationIndices(int[] A, int[] B, int k) 
{ 
    HashMap<Integer,Integer> aDivisors = new HashMap<Integer,Integer>(); 
    for(int i=0;i<A.length;i++) 
    { 
     int a = A[i]; 
     if(a!=0) 
     { 
      int d = k/a; 
      if(d*a == k) 
       aDivisors.put(d, i); 
     } 
    } 
    for(int i=0;i<B.length;i++) 
    { 
     Integer ai = aDivisors.get(B[i]); 
     if(ai != null) 
      return new Result(ai, i); 
    } 
    return null; 
} 
+0

Rotsor merci pour votre effort .. Je me demandais pourquoi personne ne m'a suggéré d'utiliser le tas :) – Hades200621

+0

Oui, cela fonctionne même lorsque tous sont identiques. – bbudge

+0

@ gleb-pendler Peut-être parce que tas est fondamentalement la même chose que le tableau trié dans notre cas? Le tas est bon pour ajouter des objets à la volée, sinon il trie juste. – Rotsor

2

utilisation nlog (n) pour trier
itterate puis à travers le tableau
pour chaque indice i calculer ce que A [j] devrait être pour que l'équation soit satisfaite
vérifier pour voir s'il y a cette une valeur dans le tableau

O (nlogn) + O (N) * O (log n) = O
(nlogn)

3
Sort the array. Also build a permuted index array by initializing an auxiliary array to 0, 1, 2 ... n and swapping indices every time you swap elements in the array, Time O(nLog(n)) 

for each element a[i] in array, Time O(n) 

    Binary Search for (a) k/a[i] or (b) a[i] - k, if found, return index j from permuted index array, Time O(log(n)) 
+0

J'ai gagné la course: D –

+0

Vous n'avez pas dit recherche binaire! – bbudge

+0

Aussi, je me demande si nous aurons un «A»? – bbudge

3

chose d'abord le haut de ma tête:

Make a Map<Integer, Integer> 

for each number a in A: 
    if (k/a) is a key in the HashMap: 
     output the index of a, and HashMap.get(k/a) 
    else 
     HashMap.add(a, indexof(a)) 

Il est donc O (n) pour traverser le tableau, et O (log n) pour rechercher la clé dans la carte (en supposant que vous utilisez un TreeMap, HashMap pourrait être mieux dans le meilleur des cas, mais pire le pire des cas)

Edit: Je suppose que les réponses seulement), mais vous avez l'idée

+0

Jean-Bernard Pellerin a d'abord accepté sa réponse ainsi que Graphics Noob (pas si noob après tout:?) Pour le plus de temps de course effet merci beaucoup de monde ce forum est vraiment génial ... – Hades200621

0

Si k est fixé, alors il y a un nombre fini d'entiers x, y tels que x * y = k. Pour chaque facteur (x, y), parcourez la liste en recherchant si A [i] = x ou A [i] = y. Temps d'exécution total = O (n) * # facteurs de k = O (n) (déterminisme, pas hypothèses sur le hachage)

Le problème indique que A [i] sont tous positifs, donc k peut être décomposé x + y = k de manière infiniment différente, donc O (n) aussi.

Questions connexes