Maison  >  Article  >  développement back-end  >  Comment résoudre le problème de la somme de trois nombres en PHP

Comment résoudre le problème de la somme de trois nombres en PHP

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-07-13 14:52:071457parcourir

Étant donné un tableau nums contenant n entiers, déterminez s'il y a trois éléments a, b, c dans des nombres tels que a+b+c=0 ? Que devons-nous faire lorsque nous rencontrons ce genre de problème ? Aujourd’hui, je vais vous expliquer cela.

Comment résoudre le problème de la somme de trois nombres en PHP

Donnez Vous avez un tableau nums contenant n entiers, déterminez s'il y a trois éléments a, b, c en nombres tels que a + b + c = 0 ? Veuillez trouver tous les triples qui remplissent les conditions et qui ne se répètent pas.

Remarque : les triples répétés ne sont pas autorisés dans la réponse.

Exemple :

给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:[
 [-1, 0, 1],
 [-1, -1, 2]]

Idée de résolution de problèmes 1

Méthode d'énumération violente, à trois niveaux pour + si le jugement suffit, pour que l'offre soit fait pendant l’entretien Devenir celui de quelqu’un d’autre. Si vous n’écrivez plus de code, celui-ci expirera facilement si la quantité de données est importante.

Idée de résolution de problèmes 2

Vous pouvez d'abord fixer une valeur, puis utiliser une méthode à double pointeur pour trouver les deux dernières valeurs, optimisant ainsi la complexité temporelle totale à O (n^2).

Pendant le processus de mise en œuvre, une attention particulière doit être portée à l'optimisation et à la déduplication.

Nous trions d'abord le tableau d'origine, afin que les valeurs en double puissent être rassemblées pour faciliter la déduplication.

Lors de la détermination du premier élément, s'il est déjà supérieur à 0, vous pouvez directement sortir de la boucle, car les nombres suivants sont tous supérieurs à lui. Par exemple, [1, 2, 3, 4], i = 0, nums[i] > 0, il est impossible de produire une situation juridique, alors rompez simplement.

Lors de la détermination du premier élément, s'il s'avère qu'il est identique à la valeur qui le précède, sautez ce tour. Par exemple, [-1, -1, 0, 1], après le premier tour, {-1, 0, 1} a été sélectionné, maintenant i = 1, nums[i] == nums[i - 1], Pour éviter les doublons, continuez directement.

Ensuite, utilisez des pointeurs doubles, les points gauches vers i + 1 et les points droits pour compter ($nums) - 1. Portez des jugements un par un et veillez à supprimer les doublons. C'est un peu comme fixer une valeur, puis utiliser deux pointeurs pour trouver la somme des deux nombres.

class Solution {
    /** * @param Integer[] $nums * @return Integer[][] */
    function threeSum($nums) {
        $result = [];
        $count = count($nums);
        if ($nums === null || count($nums) <= 2) return $result;
        sort($nums); // O(nlogn)
        for ($i = 0; $i < $count - 2; $i++) { // O(n^2)
            if ($nums[$i] > 0) break; // 第一个数大于 0,后面的数都比它大,肯定不成立了
            if ($i > 0 && $nums[$i] === $nums[$i - 1]) continue; // 去掉重复情况
            $target = -$nums[$i];
            $left = $i + 1;
            $right = $count - 1;
            while ($left < $right) {
                if ($nums[$left] + $nums[$right] === $target) {
                    $result[] = [$nums[$i], $nums[$left], $nums[$right]];
                    // 现在要增加 left,减小 right,但是不能重复,比如: [-2, -1, -1, -1, 3, 3, 3], i = 0, left = 1, right = 6, [-2, -1, 3] 的答案加入后,需要排除重复的 -1 和 3
                    $left++;
                    $right--; // 首先无论如何先要进行加减操作
                    while ($left < $right && $nums[$left] === $nums[$left - 1]) $left++;
                    while ($left < $right && $nums[$right] === $nums[$right + 1]) $right--;
                } else if ($nums[$left] + $nums[$right] < $target) {
                    $left++;
                } else {  // $nums[$left] + $nums[$right] > $target
                    $right--;
                }
            }
        }
        return $result;
    }}

Apprentissage recommandé : tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer