三数之和/LeetCode.No.15/类似题目:No.1:两数之和 No.16:最接近的三数之和

思路:1.先排序保证不重复以及减小复杂度 2. 左右双指针,左指针右移,右指针左移

代码实现:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        if n < 3:
            return []
        nums.sort()#先排序,保证不重复并且减少时间复杂度
        res = []
        # 左右双指针,时间复杂度O(n^2)
        #三数相加等于0,那么先固定第一个数,后两个数相加等于定值,因此第二个数增加第三个数必定减小,左右双指针
        for i in range(n-2):
            if nums[i] > 0: #如果第一个数大于0,那么三数之和不可能等于0
                break
            if i > 0 and nums[i] == nums[i-1]:
                continue #保证不重复 !使用continue
            left = i + 1
            right = n - 1
            while left < right:
                if nums[i]+nums[left]+nums[right]==0:
                    res.append([nums[i], nums[left], nums[right]])
                    while left < right and nums[left+1]==nums[left]: #!用while而不是if
                        left+=1
                    while left < right and nums[right]==nums[right-1]:
                        right-=1
                    left += 1
                    right -= 1
                elif nums[i]+nums[left]+nums[right]>0:
                    right -= 1
                else:
                    left += 1
        return res

        '''
        # 时间复杂度O(n^2*log(n)),超时
        for i in range(n-2):
            if nums[i]>0:
                break
            for j in range(i+1, n-1):
                tmp = -1*(nums[i] + nums[j])
                left = j+1
                right = n-1
                while left <= right:
                    mid = (left+right)//2
                    print(mid)
                    if nums[mid]>tmp:
                        right = mid-1
                    elif nums[mid]<tmp:
                        left = mid+1
                    else:
                        ans = sorted([nums[i], nums[j], nums[mid]])
                        if ans not in res:
                            res.append(ans)
                        break
        return res
        '''
        '''
        # 暴力搜索,时间复杂度O(n^3)超时
        res = []
        for i in range(n-2):
            for j in range(i+1, n-1):
                tmp = -1*(nums[i] + nums[j])
                for k in range(j+1,n):
                    if nums[k] == tmp:
                        ans = sorted([nums[i], nums[j], nums[k]])
                        if ans not in res:
                            res.append(ans)
        return res
        '''

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值