Répertoire d'articles
1. Description
Étant donné un tableau d'entiers nums et une cible de valeur cible, veuillez trouver les deux entiers dont la somme est la valeur cible dans le tableau et renvoyer leurs indices de tableau.
Vous pouvez supposer que chaque entrée ne correspondra qu'à une seule réponse. Cependant, le même élément du tableau ne peut pas être utilisé deux fois.
2. Exemple
Étant donné nums = [2, 7, 11, 15], target = 9
car nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9
donc renvoie [0, 1]
3. Analyse
Objectif: trouver deux nombres du tableau afin que leur somme soit égale à une valeur donnée.
Deux limitations sont données dans le titre. Le premier point est que pour une valeur donnée, il n'y aura qu'une seule situation dans le tableau qui fera que la somme des deux nombres remplisse la condition; le deuxième point est que le même élément du tableau ne peut pas être utilisé deux fois.
3.1. Recherche par force brute
Pour toutes les valeurs du tableau, effectuez une correspondance par paire, et leur somme est égale à la valeur donnée, et ces deux nombres sont trouvés.
Deux niveaux de parcours sont requis et chaque niveau de parcours recherche un nombre; lorsque leur somme est égale à une valeur donnée, la recherche s'arrête.
Complexité temporelle: O (n 2) O (n ^ 2) dans le pire des casO ( n2 )。
3.2. Correspondance de dictionnaire
Connaissant la valeur cible, le complément d'un nombre peut être déterminé.
Par exemple, il est maintenant nécessaire que la somme de 2 nombres soit 9, dont l'un est 1, et quel est l'autre?
L'autre nombre est 8 (9-1), qui est num2 = target-num1.
Nous pouvons profiter de cette propriété.
Nous devons visiter le tableau une fois, définir l'élément de tableau actuellement visité comme nums [i], et rechercher si nums [i] existe déjà (clé) dans un dictionnaire.
S'il n'existe pas, utilisez (target-nums [i]) comme clé (clé) du dictionnaire, et insérez l'indice i comme valeur (valeur) du dictionnaire;
s'il existe déjà, spécifiez (target-nums [i] ) Doit exister dans le tableau nums et avoir été visité, son indice peut être obtenu à partir du dictionnaire.
De cette manière, ces deux nombres peuvent être obtenus avec un seul parcours.
Complexité temporelle: O (n) O (n) dans le pire des casO ( n )。
4. Code
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indices = new int[2];
out:
for(int i = 0; i < nums.length; ++i)
{
for(int j = i + 1; j < nums.length; ++j)
{
if(nums[i] + nums[j] == target)
{
indices[0] = i;
indices[1] = j;
break out;
}
}
}
return indices;
}
}
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indices = new int[2];
Map<Integer, Integer> dict = new HashMap<>();
for(int i = 0; i < nums.length; ++i)
{
if(dict.containsKey(nums[i]))
{
indices[0] = dict.get(nums[i]);
indices[1] = i;
break;
}
else
{
dict.put(target - nums[i], i);
}
}
return indices;
}
}
5. Vérification
6. Source
- LeetCode 1. Somme de deux nombres
Source: LeetCode
Lien: https://leetcode-cn.com/problems/two-sum Le
copyright est la propriété de LeetCode . Pour les réimpressions commerciales, veuillez contacter l'autorisation officielle. Pour les réimpressions non commerciales, veuillez indiquer la source.