双指针问题

 

双指针可用于多种情景之下,用于查找数组中满足条件的数,

#coding=utf-8
###查找三个数加起来等于0
def findThreeSum(nums,target=0):
    nums.sort()
    res = []
    for left in xrange(nums.__len__()):
        if left > 0 and nums[left] == nums[left-1]:
            continue
        if nums[left] > 0:
            break
        mid,right = left+1,nums.__len__()-1
        target_less = target - nums[left]
        while mid < right:
            if nums[mid]+nums[right] == target_less:
                res.append([nums[left],nums[mid],nums[right]])
                mid+=1
                right-=1
                while mid < right and nums[mid] == nums[mid-1]:
                    mid+=1
                while mid < right and nums[right] == nums[right+1]:
                    right-=1
            elif nums[mid]+nums[right] > target_less:
                right-=1
            else:
                mid+=1
    return res

##查找三个数与目标值最接近
def find3SumCloset(nums,target):
    if nums.__len__() < 3:
        return
    nums.sort()
    tmp,res = abs(target - nums[0] - nums[1] - nums[-1]),[nums[0],nums[1],nums[-1]]
    for left in xrange(len(nums)-2):
        mid,right = left+1,len(nums)-1
        while mid < right:
            if nums[mid]+nums[right]+nums[left] == target:
                return target
            elif nums[mid]+nums[right]+nums[left] < target:
                targetLess = abs(target - nums[mid]-nums[right]-nums[left])
                if targetLess < tmp:
                    tmp,res = targetLess,[nums[mid],nums[right],nums[left]]
                mid+=1
            else:
                targetLess = abs(target - nums[mid] - nums[right] - nums[left])
                if targetLess < tmp:
                    tmp,res = targetLess,[nums[mid],nums[right],nums[left]]
                right-=1
    return res

##
def find3Sum(nums,first,target,res):
    for second in xrange(first+1,len(nums)-2):
        if second > first+1 and nums[second-1] == nums[second]:
            continue
        third,fourth = second+1,len(nums)-1
        while third<fourth:
            if nums[second]+nums[third]+nums[fourth] == target:
                res.append([nums[first],nums[second],nums[third],nums[fourth]])
                third+=1
                fourth-=1
                while third<fourth and nums[third] == nums[third-1]:
                    third+=1
                while third<fourth and nums[fourth] == nums[fourth+1]:
                    fourth-=1
            elif nums[second]+nums[third]+nums[fourth] > target:
                fourth-=1
            else:
                third+=1
##查找4个数等于目标值
def find4Sum(nums,target):
    if nums.__len__()<4:
        return None
    nums.sort()
    res = []
    for fisrt in xrange(nums.__len__()-3):
        if fisrt>0 and nums[fisrt] == nums[fisrt-1]:  ###防止重复结果出现
            continue
        if nums[fisrt]*4>target:  ##预判是否能够满足要求
            return res
        find3Sum(nums,fisrt,target-nums[fisrt],res)  ##调用查找3个数等于目标值
    return res

if __name__ == '__main__':
    nums = [-1,-5,-5,-3,2,5,0,4]
    # print(findThreeSum(nums,0))
    print(find4Sum(nums,-7))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值