【LeetCode系列】Leet Code OJ 15. 3Sum [Difficulty: Medium]

这道题最原始的方法应该是三重循环,这样子就能够遍历出三个数了。

但是这么看的话肯定会超时,我们可以看看,三个数的和是0,那么第三个数肯定是能够通过前两个数求出来的,因此,这样子就能够省去了一重循环,只要判定这个数存在,那么就可以用O(n^2)的时间复杂度做出来了。于是我写了下面的代码:s

原本的想法是搜寻一个最小的,一个最大的,剩下的就是中间的。

    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        dic = {}
        for nu in nums:
            dic[nu] = 1 if nu not in dic.keys() else dic[nu]+1
        resu = []
        arr = sorted(dic.keys())
        for i in range(len(arr)):
            key1 = arr[i]
            if key1 > 0: break
            dic[key1] = dic[key1] - 1
            for j in range(i, len(arr)):
                key2 = arr[j]
                if key2 > (-key1+1)//2 : break
                if dic[key2] == 0: continue
                dic[key2] -= 1
                key3 = 0 - key1 - key2
                if key3 in arr and dic[key3] > 0 and key3 >= key2:
                    resu.append([key1,key2,key3])
                dic[key2] += 1
            dic[key1] += 1
        return resu

这样子提交之后,错误肯定是没有错误的,但是却遇到了超时的问题。这时候,肯定需要对算法本身再进行优化才行了。

从网上找了很多相关的解题报告,把他们的Python代码丢进去,也都是超时,心很累。。如果有什么优化的xi想法再丢上来hao好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值