Le problème de la somme de deux nombres (trouvez les deux éléments du tableau comme les deux éléments de l'entier donné)

Problème: Entrez un entier x contenant n entiers qui est un tableau A, trouvez i et j qui satisfont A [i] + A [j] = x, et s'il n'y a pas une telle somme d'éléments, retournez -1 et -1.

 

Mon analyse est la suivante:

Cette question doit être notée: il peut y avoir des éléments en double dans le tableau, et il y a plus d'un ensemble de solutions qui remplissent les conditions .

Par exemple, étant donné le tableau A [1,3,2,2] et x = 4, la solution qui satisfait la condition est

(0, 1): 1 + 3 = 4 et (2, 3): 2 + 2 = 4.

 

Solution 1: solution violente

Itérer sur chaque élément A [i] et trouver s'il y a un élément cible avec une valeur égale à xA [i].

Cas de test et résultats en cours:

Solution 2: trier d'abord + pointeur + HashMap

  Triez d'abord le tableau donné, puis créez deux pointeurs (i, j), l'un du nœud de début à l'arrière d'i ++, et l'autre du nœud de queue à l'avant de j--;

 Il y a trois cas:

int i = 0, j = A.length;

      while(i < j) {

          if(A[i]+A[j] < x) 

             i++;

          else if(A[i]+A[j] > x) 

             j--;

          else

             System.out.print("find out!");

    }

   Toutefois, l'index du tableau sera confondu en raison de la réorganisation. Par conséquent, les éléments du tableau d'origine et leurs index peuvent être stockés dans la table de hachage avant le tri. Une fois les éléments détectés avec le pointeur, l'index d'origine est extrait via la table de hachage.

Analyse de la complexité temporelle, la table de hachage d'accès est O (n), l'ordre est O (nlog (n)) et la recherche de pointeur est O (n), ce qui représente environ O (2n + nlog (n)).

Solution 3: table de hachage

hm: stocker les éléments et les index dans le tableau sous la forme <clé, valeur> dans la table de hachage hm, (optimisé progressivement de traverser la table de hachage deux fois à traverser la table de hachage une fois)

(1) La première pensée est de parcourir deux fois la table de hachage: f (n) = 2n

         * La première fois consiste à stocker chaque élément du tableau et son index dans une table de hachage sous forme de paires clé-valeur

         * La deuxième fois consiste à parcourir tour à tour chaque élément A [i] pour voir si xA [i] est une clé dans la table de hachage. Si elle existe, la valeur de la clé est l'index.

Mais le problème avec cette situation est: parce que la traversée produira deux fois la solution, comme (1, 2) et (2, 1).

(2) Les deux tables de hachage de parcours ci-dessus peuvent être modifiées en une seule traversée f (n) = n, c'est-à-dire qu'avant d'ajouter l'élément de tableau a [i] à la table de hachage, déterminez d'abord si xa [i] est déjà dans le hachage actuel Dans le tableau, puis ajoutez, afin qu'il n'y ait pas de solution de sortie en double.

     * La table de hachage échange l'espace contre du temps, la complexité de l'espace est O (n), la complexité temporelle est O (n)

     * Inconvénients: les clés en double ne sont pas autorisées dans la table de hachage, donc cet algorithme ne peut pas résoudre la situation du même élément dans le tableau.

Remarque: Certains problèmes indiqueront qu'il n'existe qu'une seule paire de solutions de ce type. Cette situation est relativement simple. Vous n'avez pas besoin de prendre en compte les éléments répétés et vous pouvez terminer le programme tant que vous trouvez la solution.

Publié 61 articles originaux · 61 éloges · 20 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/qq_42475914/article/details/104743872
conseillé
Classement