leetcode_18. 四数之和

leetcode_18. 四数之和

题目

leetcode题目链接

思路分析

题目要求:在数组中找4个数,和为最后的target

  • 通过2层循环,建立每2数之和的每一种情况的字典(2数之和:2数下标)
  • 判断 另外2个数的和,是否在字典里
  • 如果在字典里,并且不重复,再添加到最终的结果

代码展示

class Solution:
    def fourSum(self, nums, target):
        numslen =len(nums)
        #如果不加排序 结果会重复
        nums.sort()
        #最后的结果是一个集合,不允许有重复
        res = set()
        #建立字典
        dic = {}
        #通过2层循环,建立2数之和的每一种情况
        for i in range(numslen-1):
            # for j in range(1,numslen):
            for j in range(i+1,numslen):
                temp = nums[i]+nums[j]
                if temp not in dic:
                    dic[temp]=[(i,j)]
                else:
                    dic[temp].append((i,j))
        #判断 另外2个数的和,是否在字典里
        for i in range(numslen-1):
            for j in range(i+1,numslen):
                numone = nums[i]+nums[j]
                numtwo = target-numone
                if numtwo in dic:
                    for p in dic[numtwo]:
                        #在字典里,并且不重复,添加到最终的结果
                        if p[0]>j:
                            # res.append((i,j,p[0],p[1]))
                            # res.add((i,j,p[0],p[1]))
                            res.add((nums[i],nums[j],nums[p[0]],nums[p[1]]))               
        res1 = []
        for i in res:
            res1.append(i)
        return res1

if __name__ == "__main__":
    a = Solution()
    print(a.fourSum([1,0,-1,0,-2,2],0))     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值