0
点赞
收藏
分享

微信扫一扫

leetcode刷题250天(4)——15.三数之和

北溟有渔夫 2022-03-10 阅读 24
class Solution(object):
    def threeSum(self, nums):
        # 思路:本题完全可以变成 指定值 + twoSum() 问题

        # 声明承接满足条件的组合
        res = []
        # 异常处理 长度小于3 不满足题意
        len_ = len(nums)
        if len_ <= 2:
            return res

        # 将数据排序
        nums.sort()
        
        for i in range(len_):
            # 由于题意是三数之和为0, 如果当前最小值大于0, 说明之后的组合无法满足题意
            if nums[i] > 0:
                break
            # 重复处理, 若存在重复值, 则对应的三元组应该也是相同的, 所以跳过
            if i > 0 and nums[i] == nums[i-1]:
                continue
            
            # 把三元问题变为 i + 【i : len()-1】 的问题 
            left = i + 1
            right = len_ - 1
            
            # 二元问题求解
            # 两数之和 > target: 右指针左移变小
            # 两数之和 < target: 左指针右移变大
            while left < right:
                sum = nums[i] + nums[left] + nums[right]
                if sum == 0:
                    res.append((nums[i], nums[left], nums[right]))
                    while left<right and nums[left] == nums[left+1]:
                        left += 1
                    while left<right and nums[right] == nums[right-1]:
                        right -= 1
                    left += 1
                    right -= 1
                elif sum < 0: left += 1
                elif sum > 0: right -= 1
            
        return res
        
举报

相关推荐

0 条评论