三数之和/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
        '''

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值