>  기사  >  백엔드 개발  >  PHP에서 세 숫자의 합 문제를 해결하는 방법

PHP에서 세 숫자의 합 문제를 해결하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-07-13 14:52:071410검색

n개의 정수를 포함하는 nums 배열이 주어졌을 때, a+b+c=0이 되는 세 개의 요소 a, b, c가 num에 있는지 확인하세요. 이런 문제가 발생하면 어떻게 해야 합니까? 오늘은 그 문제를 해결해 드리겠습니다.

PHP에서 세 숫자의 합 문제를 해결하는 방법

n개의 정수를 포함하는 nums 배열이 주어지면 nums에 a + b + c = 0이 되는 세 개의 요소 a, b, c가 있는지 확인하세요. 조건을 만족하고 반복되지 않는 트리플을 모두 찾아보세요.

참고: 답변에 중복된 트리플은 허용되지 않습니다.

예:

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

문제 해결 아이디어 1

폭력적인 열거 방법, +에 대한 3단계 판단이 충분하면 면접 제안이 ​​다른 사람의 것이 됩니다. 더 이상 코드를 작성하지 않으면 데이터 양이 많으면 타임아웃되기 쉽습니다.

문제 해결 아이디어 2

먼저 값을 수정한 다음 이중 포인터 방법을 사용하여 마지막 두 값을 찾아 총 시간 복잡도를 O(n^2)로 최적화할 수 있습니다.

구현 과정에서는 최적화와 중복 제거에 주의를 기울여야 합니다.

먼저 중복 제거를 용이하게 하기 위해 중복 값을 그룹화할 수 있도록 원본 배열을 정렬합니다.

첫 번째 요소를 결정할 때 이미 0보다 큰 경우 후속 숫자가 모두 0보다 크므로 루프에서 직접 점프할 수 있습니다. 예를 들어 [1, 2, 3, 4], i = 0, nums[i] > 0이면 합법적인 상황을 연출할 수 없으므로 그냥 중단하세요.

첫 번째 요소를 결정할 때 이전 값과 동일한 것으로 확인되면 이번 라운드를 건너뜁니다. 예를 들어 [-1, -1, 0, 1], 첫 번째 라운드 이후 {-1, 0, 1}이 선택되었으므로 이제 i = 1, nums[i] == nums[i - 1], 중복을 피하려면 직접 계속하세요.

다음으로 이중 포인터를 사용하고 왼쪽 포인트는 i + 1을 가리키고 오른쪽 포인트는 count($nums) - 1을 가리킵니다. 하나씩 판단하고 중복 제거에 주의하세요. 이는 값을 고정한 다음 두 포인터를 사용하여 두 숫자의 합을 찾는 것과 비슷합니다.

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;
    }}

추천 학습: php 비디오 튜토리얼

위 내용은 PHP에서 세 숫자의 합 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 hxd.life에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제