15-3sum

Try it on leetcode

Description

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

 

Example 1:

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

Example 2:

Input: nums = []
Output: []

Example 3:

Input: nums = [0]
Output: []

 

Constraints:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

Solution(Python)

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        return self.KSum(nums, 0, 3)

    def KSum(self, nums, target, k):

        n = len(nums)

        if not n:
            return []

        average = target // k

        if average < nums[0] or average > nums[-1]:
            return []

        if k == 2:
            return self.twosum(nums, target)

        res = []

        for i in range(n):
            if i == 0 or nums[i] != nums[i - 1]:
                for subset in self.KSum(nums[i + 1:], target - nums[i], k - 1):
                    res.append([nums[i]] + subset)

        return res

    def twosum(self, nums, target):
        lo = 0
        n = len(nums)
        hi = n - 1
        res = []

        while lo < hi:
            curr_sum = nums[lo] + nums[hi]
            if curr_sum < target or (lo > 0 and nums[lo] == nums[lo - 1]):
                lo += 1
            elif curr_sum > target or (hi < len(nums) - 1 and nums[hi] == nums[hi + 1]):
                hi -= 1
            else:
                res.append([nums[lo], nums[hi]])
                lo += 1
                hi -= 1
        return res