leetcode-4sum问题

题目大意是:给定一个长度为N的数组,求解里面有多少4元组(a,b,c,d)的和满足给定的target,注意四元组不能够重复(1,2,3,4)和(2,1,3,4)算同一种!

分析:这个题目用C++跑O(n^3)的算法是可以过的,但是我们可以找到一种更简单的方法来解决问题。首先计算所有二元组(i,j)对应的nums[i]+nums[j]的和并且存储起来。然后将这个问题转换成为一个2sum的问题即可。下面是coding细节。

我们遍历所有的二元组(i,j)的时候,要注意找到的另外一个二元组(m,k)和(i,j)组成了(i,j,m,k),由于(i,j)会遍历所有的二元组,所以我们要通过对大小顺序进行限制来保证该四元组的不重复。i < j < j < m < k。另外四元组不重复不代表(nums[i],nums[j],nums[m],nums[k])不重复,所以还需要在一开始进行一次sort来让两者大小顺序对应。另外由于元素有重复的地方,所以必须要将答案用set保存来去重。
class Solution(object):
    def fourSum(self,nums,target):
        result = set()
        n = len(nums)
        my_map = {}
        nums.sort()
        my_count = set()
        for i in range(n):
            for j in range(i+1,n):
                x = nums[i]+nums[j]
                if x in my_map:my_map[x].append((i,j))
                else:my_map[x]=[(i,j)]

        for x in my_map:
            if target-x in my_map:
                for set1 in my_map[x]:
                    for set2 in my_map[target-x]:
                        i1,j1 = set1
                        i2,j2 = set2
                        if i2>j1:#avoid duplicate
                            result.add(tuple([nums[i1],nums[j1],nums[i2],nums[j2]]))
        return [list(x) for x in result]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值