leetcode15三数之和

第一眼望过去 暴力O(n^3),反手就是TLE。
然后想了想 降低复杂度,首先排序一遍O(nlog(n)),然后两层循环;
第一层用于选择第一个值,第二层枚举两个端点,一个(begin)从左往右,另一个(end)从右往左。当begin>=循环完毕在这期间判断nums[i] + nums[begin] + nums[end] 的和是否为0.
注意重复值的判断


class Solution:
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        a = []
        b = []
        nums.sort()
        for i in range(len(nums)-2):
            begin = i + 1
            end = len(nums) -1
            while begin < end:
                cnt = nums[begin] + nums[end] + nums[i]
                if cnt == 0:
                    b.append(nums[i])
                    b.append(nums[begin])
                    b.append(nums[end])
                    b.sort()
                    if b not in a:    #自以为是的用not in 来判重,再次一发TLE打脸
                        a.append(b)
                    b = []
                    begin += 1
                    end -= 1
                elif cnt < 0:
                    begin += 1
                else:
                    end -= 1
        return a

终于不再TLE的说

"""
因为是排序过得数组,所以在第一层for中,如果nums[i]在之前出现过,那么后续的查找过程中必定会出现重复,此时应该直接跳出循环
"""
class Solution:
    # @param {integer[]} nums
    # @return {integer[][]}
    def threeSum(self, nums):
        a = []
        b = []
        nums.sort()
        a.append([1, 1, 1])  #添加一个错误的答案使得a列表不为空
        for i in range(len(nums)-2):
            print(i)
            if i > 0 and nums[i] == nums[i-1]:  #因为是排序过得数组,所以在第一层for中,如果nums[i]在之前出现过,那么后续的查找过程中必定会出现重复,此时应该直接跳出循环
                continue
            begin = i + 1
            end = len(nums) -1
            #a.append([1,1,1])
            while begin < end:
                cnt = nums[begin] + nums[end] + nums[i]
                if cnt == 0:
                  #  print("dadad")
                    b.append(nums[i])
                    b.append(nums[begin])
                    b.append(nums[end])
                    if b != a[len(a)-1]:   #排序过得数组,所以在固定第一个元素的情况下,若出现相同的答案那么必定是已经加入到a中的最后一个元素
                        #b.sort()
                        a.append(b)
                    b = []
                    begin += 1
                    end -= 1
                elif cnt < 0:
                    begin += 1
                else:
                    end -= 1
        return a[1:] #去掉第一个错误答案
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值