🐙

NeetCode 150 [Two Pointers]:medium 2/3

に公開

NeetCodeのSolutionを書いていく

3Sum

問題概要

整数の配列numbersが与えられます。
合計値が0となる配列のi,j,k番目の値からなる3つの組み合わせを返しなさい。
組み合わせのi,j,kはそれぞれユニークです。

  • 制約
    • 入力の配列数は 3 以上 1000 以下
    • 数値は -10^5 以上 10^5 以下

計算回数:O(n^2)
メモリ:O(1)
nはnumsの配列数

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]

メモ

単純に2重ループで2つの数字を選んで、それに-1をかけた値を探せばOK?
答えを見ると、入力をsortして、2つ目、3つ目の値を前からと後ろからのポインタ移動で検索するのが効率的とのこと。
そうか、だからTowPointersか。

from typing import List


class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        retval = list()
        for i, ni in enumerate(nums):
            for j, nj in enumerate(nums[i + 1 : -1]):
                if -(ni + nj) in nums[i + 1 + j + 1 :]:
                    result = sorted((ni, nj, -(ni + nj)))
                    if result not in retval:
                        retval.append(result)
        return retval

Discussion