Voici le code de cet algorithme, implémenté en javascript, mais je ne comprends pas l'algorithme ci-dessous. Demandez à Dieu de vous expliquer.
var twoSum = function(nums, target) {
var ret = [];
var exist = {};
for(var i = 0; i < nums.length; i++){
if(typeof(exist[target - nums[i]]) !== 'undefined'){
ret.push(exist[target - nums[i]]);
ret.push(i + 1);
}
exist[nums[i]] = i + 1;
}
return ret
};
Le questionneur peut essayer d'utiliser des exemples pour lire le code. Voici mon avis :
Par exemple, cliquez simplement sur l'exemple dans la capture d'écran :
La boucle for parcourt principalement le premier tableau de paramètres, puis effectue deux étapes clés :
Regardons d'abord celle qui suit if.
exist[nums[i]] = i + 1;
Cette phrase sera exécutée dans chaque boucle exist ici signifie dictionnaire Par exemple, le premier nombre parcouru est 2 (i=0), donc exist est enregistré : {2 : 1}. Une telle paire clé-valeur, donc après une boucle, existera :array À son tour, « valeur d'élément » : un dictionnaire de paires clé-valeur de « index de tableau + 1 ».
Ensuite, regardons le jugement dans if. Bien sûr, lorsque i=0 dans la boucle for, exist n'a pas encore injecté la paire clé-valeur, et l'expression if est fausse
Mais quand i=1, exist[target-nums[1]] signifie exist[9-7] = exist[2]. N'est-ce pas la première paire clé-valeur d'exist qui a été injectée lorsque i=0 ? ? Alors, enregistrez la valeur de la paire clé-valeur correspondante (en fait l'index de la valeur d'origine + 1 dans le tableau d'origine) dans ret, puis enregistrez le i+1 actuel dans ret... Enfin, une fois la boucle terminée , revenez à ret , nous avons donc [1,2] ps : La réponse à l'exemple donné par le questionneur n'est pas cohérente avec le code.
Résumé : Le cœur de cet algorithme est d'utiliser l'objet exist pour stocker les éléments du tableau qui ont été parcourus, et d'utiliser target-nums[i] pour utiliser indirectement exist pour déterminer s'il existe des éléments qui remplissent les conditions parmi les éléments qui ont été parcourus dans le tableau.