15. 三数之和

https://leetcode-cn.com/problems/3sum/

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
    [-1, 0, 1],
    [-1, -1, 2]
]

排序 + 双指针

备注

  • 时间复杂度:O(n^2),数组排序 O(Nlog N)O(NlogN),遍历数组 O(n),双指针遍历 O(n)

  • 空间复杂度:O(1)


class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        nums.sort()
        length = len(nums)
        for k in xrange(length-2):
            if nums[k] > 0:
                break
            if k > 0 and nums[k] == nums[k-1]:  # skip the same value
                continue
            l, r = k + 1, length - 1
            while l < r:
                s = nums[k] + nums[l] + nums[r]
                if s < 0:
                    l += 1
                elif s > 0:
                    r -= 1
                else:
                    res.append([nums[k], nums[l], nums[r]])
                    l += 1
                    r -= 1

                    while l < r and nums[l] == nums[l-1]:
                        l += 1
                    while l < r and nums[r] == nums[r+1]:
                        r -= 1
        return res