三数之和(python解法)

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

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

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

解题设计:求解三数之和,可以用三层循环分别找到符合题意的三个数,但是那样所需要的时间则为O(n3),是一种解决方法,但是很耗时间。所以可以将三数之和考虑为2+1的形式,先求解两个数的和,此处三数之和为0,则需要找的第三个数则为求和两数的相反值。而找这个数在python中非常简单,假设这个数为c,则只需要写c in nums即可判断是否存在这个数,但只做这个判断有可能会使同一个数在解答的一个三元组中出现两次,所以此处采用字典的形式,将每个元素与其所对应的下标组成键值对。这样即可轻易地避免元素重复地出现。

代码:

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        m={}
        for i in range(len(nums)):
            m[nums[i]]=i
        l = []
        for a in range(len(nums)): 
            for b in range(len(nums)):
                if (a != b) and -(nums[a]+nums[b]) in nums and (a!=m[-(nums[a]+nums[b])]) and (b!=m[-(nums[a]+nums[b])]):
                        
                        l.append(sorted([nums[a],nums[b],-(nums[a]+nums[b])]))
        return(list(list(t) for t in(set([tuple(t) for t in l]))))
                        
                    
        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值