双指针可用于多种情景之下,用于查找数组中满足条件的数,
#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))