1-15-18-454. 234Sum [Easy & Medium] Sum系列问题

博客主要围绕两数、三数、四数求和问题展开。对于 3Sum 和 4Sum 问题,时间复杂度为 O(n3),需先排序,在循环和指针移动时处理重复值;4Sum II 问题时间复杂度为 O(n2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Two Sum

17368230-4a7259df5b144061.png
1. Two Sum
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dic = {}
        for i in range(len(nums)):
            if nums[i] in dic:
                return [dic[nums[i]], I]
            else:
                dic[target - nums[i]] = I

15. 3Sum

17368230-c4632e70d8279cac.png
15.3Sum
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        m = len(nums)
        res = []
        for i in range(m-2):
            if i>0 and nums[i]==nums[i-1]:
                continue
            left = i + 1
            right = m - 1
            tgt = -nums[I]
            while left < right:
                if nums[left] + nums[right] == tgt:
                    res.append([nums[i], nums[left], nums[right]])
                    while left + 1 < right and nums[left+1] == nums[left]:
                        left += 1
                    while right - 1 > left and nums[right-1] == nums[right]:
                        right -= 1
                    left += 1
                    right -= 1
                elif nums[left] + nums[right] > tgt:
                    right -= 1
                else:
                    left += 1
        return res

18. 4Sum

17368230-3b7469e858e16b30.png
18. 4Sum

O(n3)
首先要排序,重复出现在三个地方,第一层循环,第二层循环,和left,right指针,在第一层,第二层循环要记录上一个值,如果相同就continue,当满足条件,添加之后,需要将left和right指针都移动得到和之前不相同的位置上。

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        res = []
        nums.sort()
        m = len(nums)
        pre_i = None
        for i in range(m-3):
            if nums[i] == pre_i:
                continue
            pre_i = nums[i]
            pre_j = None
            for j in range(i+1, m-2):
                if nums[j] == pre_j:
                    continue
                pre_j = nums[j]
                tgt = target - nums[i] - nums[j]
                left = j + 1
                right = m - 1
                while left < right:
                    if nums[left] + nums[right] == tgt:
                        res.append([nums[i],nums[j],nums[left],nums[right]])
                        while left + 1 < right and nums[left+1] == nums[left]:
                            left += 1
                        while right - 1 > left and nums[right-1] == nums[right]:
                            right -= 1
                        left += 1
                        right -= 1
                    elif nums[left] + nums[right] > tgt:
                        right -= 1
                    else:
                        left += 1
        return res

454. 4Sum II

17368230-66ad3a65115a04ce.png
454. 4Sum II

O(n2)

class Solution(object):
    def fourSumCount(self, A, B, C, D):
        """
        :type A: List[int]
        :type B: List[int]
        :type C: List[int]
        :type D: List[int]
        :rtype: int
        """
        res = 0
        mydic = {}
        m, n = len(A), len(B)
        for i in range(m):
            for j in range(n):
                temp = 0 - A[i] - B[j]
                mydic[temp] = mydic.get(temp,0) + 1
        m, n = len(C), len(D)
        for i in range(m):
            for j in range(n):
                temp = C[i] + D[j]
                if temp in mydic:
                    res += mydic[temp]
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值