LeeCode 3Sum

题目

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:
The solution set must not contain duplicate triplets.

Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]


暴力解法

三个循环。。结果超时,此路不通。

代码示例

class Solution:
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        
        triplets = []
        for i in range(len(nums)-2):
            for j in range(i+1, len(nums) - 1):
                for k in range(j+1 , len(nums)):
                    if nums[i] + nums[j] + nums[k] == 0:
                        tmp = [nums[i], nums[j], nums[k]]
                        if set(tmp) not in list(map(set, triplets)):
                            triplets.append(tmp)
        return triplets


优化解法

需要先对数据进行排序,从左、中、右三个部分进行寻找。

class Solution:
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        nums.sort()
        for i in range(len(nums)-2):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            l, r = i+1, len(nums)-1
            while l < r:
                s = nums[i] + nums[l] + nums[r]
                if s < 0:
                    l +=1 
                elif s > 0:
                    r -= 1
                else:
                    res.append((nums[i], nums[l], nums[r]))
                    while l < r and nums[l] == nums[l+1]:
                        l += 1
                    while l < r and nums[r] == nums[r-1]:
                        r -= 1
                    l += 1; r -= 1
        return res                    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,448评论 0 10
  • 绿色的你阅读 219评论 0 0
  • 昨天没有更新,是因为,我晚餐时喝了一杯红酒,就醉了,晕晕乎乎的,八点多就上床去睡了。 结果,我这一醉,还有很大的收...
    穆漪阅读 687评论 0 1
  • 一、为什么你的投资总是失败? 经历了双十一和双十二的两次狂轰滥炸,中国960万平方公里的土,似乎都不够吃了。 看着...
    籽黍阅读 680评论 3 5
  • 2017年11月1日,如是家人李建英,第78天种种子日志 发心:我今不是为了我个人而闻思修行,而是为了六道轮回一切...
    若嘉阅读 208评论 1 3