leetcode18. 四数之和

题目描述:

题解:

参考:https://blog.csdn.net/fuxuemingzhu/article/details/83543296

def fourSum(self, nums, target):
    lennums = len(nums)
    nums.sort()
    res = []
    i = 0
    while i<lennums-3:
        j=i+1
        while j<lennums-2:
            k = j+1
            l = lennums-1
            remain = target-nums[i]-nums[j]
            while k<l:
                if nums[k]+nums[l]>remain:
                    l = l-1
                elif nums[k]+nums[l]<remain:
                    k = k+1
                else:
                    res.append([nums[i],nums[j],nums[k],nums[l]])
                    while k<l and nums[k]==nums[k+1]:
                        k = k+1
                    while k<l and nums[l]==nums[l-1]:
                        l = l-1
                    k = k+1
                    l = l-1
            while j<lennums-2 and nums[j]==nums[j+1]:
                j = j+1
            j = j+1
        while i<lennums-3 and nums[i]==nums[i+1]:
            i= i+1
        i = i+1
    return res

<1>i从nums数组第一个元素到lennums-3开始遍历,j=i+1,设定两个指针k=j+1 l=lennums-1

<2>对每一组I j k l判断,nums[i]+nums[j]+nums[k]+nums[l]是否与target相等,比target小则k+1,大则l-1

<3>利用while循环跳过nums中的重复元素。

根据原版本改进了for循环遍历的版本:

def fourSum(self, nums, target):
    lennums = len(nums)
    nums.sort()
    res = []
    for i in range(lennums-3):
        for j in range(i+1,lennums-2):
            k = j+1
            l = lennums-1
            remain = target-nums[i]-nums[j]
            while k<l:
                if nums[k]+nums[l]>remain:
                    l = l-1
                elif nums[k]+nums[l]<remain:
                    k = k+1
                else:
                    tmp = [[nums[i],nums[j],nums[k],nums[l]]]
                    #tmp.append([nums[i],nums[j],nums[k],nums[l]])

                    if tmp not in res:
                        res.append([nums[i],nums[j],nums[k],nums[l]])
                        k = k + 1
                        l = l - 1
    result = []
    if len(res)>0:
        result.append(res[0])
        for i in range(1,len(res)):
            if res[i] not in result:
                result.append(res[i])

    return result

通过:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值