【leetcode】#数组【Python】15. 3Sum 三数之和

链接:

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]
]

我的解法1: 超时了,扎心了,就是三个循环遍历

class Solution(object):
    def threeSum(self, nums):
        sol = []
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                sum_2 = nums[i] + nums[j]
                for k in range(j+1,len(nums)):
                    if sum_2 == -nums[k] and sorted([nums[i],nums[j],nums[k]]) not in sol:
                        sol.append(sorted([nums[i],nums[j],nums[k]]))
                        break
        return sol       

我的解法2:通过了,但是只击败25%。思路:先排序,因为结果是三数和为0. 最小的数一定是负数或0. 固定一个数 i,j = i + 1, k = len(nums) - 1, 求三个数的和。如果小于0,说明数需要大些,就把就j+1. 如果大于0,把k-1. 直到相遇。

class Solution:
    def threeSum(self, nums):
        sol = []
        nums = sorted(nums)
        #[-1, 0, 1, 2, -1, -4] -> [-4, -1, -1, 0, 1, 2]
        for i in range(len(nums)-2):
            # 第一个数必须是负数或0
            if nums[i] <= 0:
                # 如果接连两个数一样,则跳过。比如[-4, -1, -1, 0, 1, 2],第一个-1能有[-1,0,1]的结果,第二个-1也是,所以去重。i>0是因为有nums[i-1]。
                if i>0 and nums[i] == nums[i-1]:
                    continue
                #j、k分别表示第二个数和第三个数的索引,j从前,k从后
                j = i + 1
                k = len(nums) - 1
                while j<k:
                    #也是为了去重,比如[-4, -1, -1, -1, 0, 1, 2, 2],固定第一个-1时,第二个-1和第三个-1会得到同样的结果。j=2,k=7,append[-1,-1,2]; j=3,k=6,append[-1,-1,2]重复,所以增加筛选。
                    if j-1 != i and nums[j] == nums[j-1]:
                        j += 1
                        continue
                    #满足条件,append
                    if nums[i]+nums[j]+nums[k] == 0:
                        sol.append([nums[i],nums[j],nums[k]])
                        j += 1
                        k -= 1
                    # 结果是负的,说明要增大点,小数索引右移
                    if nums[i]+nums[j]+nums[k] < 0:
                        j += 1
                    if nums[i]+nums[j]+nums[k] > 0:
                        k -= 1
        return sol

别人的解法:384ms

class Solution:
    def threeSum(self, nums):
        nums_hash = {}
        result = list()
        for num in nums:
            nums_hash[num] = nums_hash.get(num, 0) + 1
        if 0 in nums_hash and nums_hash[0] >= 3:
            result.append([0, 0, 0])

        neg = list(filter(lambda x: x < 0, nums_hash))
        pos = list(filter(lambda x: x>= 0, nums_hash))

        for i in neg:
            for j in pos:
                dif = 0 - i - j
                if dif in nums_hash:
                    if dif in (i, j) and nums_hash[dif] >= 2:
                        result.append([i, j, dif])
                    if dif < i or dif > j:
                        result.append([i, j, dif])

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值