数据结构【双指针、数组】| leetcode 18. 四数之和(中等)

1 四指针

leetcode 15. 三数之和(中等)思想相同,区别在于再套一层循环,固定两个指针,移动另外两个指针。

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        res = []
        for i in range(len(nums)-3):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            for j in range(i+1, len(nums)-2):  # 再套一层循环
                if j > i+1 and nums[j] == nums[j-1]:
                    continue

                k, s = j+1, len(nums)-1
                while k < s:
                    total = nums[i] + nums[j] + nums[k] + nums[s]
                    if total < target:
                        k += 1
                    elif total > target:
                        s -= 1
                    else:
                        res.append([nums[i], nums[j], nums[k], nums[s]])
                        while k < s and nums[k] == nums[k+1]:
                            k += 1
                        while k < s and nums[s] == nums[s-1]:
                            s -= 1
                        k += 1
                        s -= 1
        return res

时间复杂度为 O ( n 3 ) O(n^3) O(n3)

哈希表

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        res = set()
        dictionary = {}
        if len(nums) < 4:
            return []
        nums.sort()

        # 将其中两个数存储到哈希表中,剩余两个数通过双指针求解
        for i in range(len(nums)-1):  # i和j为四个数中的后两个数
            if i < len(nums)-5 and nums[i] == nums[i+5]:  # 针对大量重复情况去一下重,避免超时
                i += 1
                continue
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] in dictionary:
                    dictionary[nums[i] + nums[j]].append((i, j))
                else:
                    dictionary[nums[i] + nums[j]] = [(i, j)]
        
        for k in range(len(nums)-3):   # k和s为前两个数
            for s in range(k+1, len(nums)-2):
                temp = target - nums[k] - nums[s]
                if temp in dictionary:
                    for m in dictionary[temp]:
                        if m[0] > s:   # 保证s < i
                            res.add((nums[k], nums[s], nums[m[0]], nums[m[1]]))
        return [list(n) for n in res]

时间复杂度为O(n^2), 第三层for循环只是为了打印。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值