如果给列表先做一个排序时间耗费nlog(n),然后新列表头尾指针,利用两个指针,指向一个最大数,一个最小数,一个最小数,两个指针指向的数的和小于target,则小指针向大的方向移动,反之,大指针向小的方向移动,这个方法耗费时间是n,肯定小于方法一。代码如下:
def twosum2(nums,target): if len(nums) < 2: return 0 i = 0 j = len(nums) - 1 result=[] while i != j: if nums[i] + nums[j] < target: i += 1 elif nums[i] + nums[j] > target: j -= 1 else: a = [nums[i], nums[j]] i += 1 while nums[i] == nums[i - 1] and i != j: i += 1#跳过相同的元素,避免重复 result.append(a) return result3sum在2sum的基础上,可以很轻松地解决这个问题,先选择一个数字作为三个数中的一个one,然后再在剩下的数中找到两个数的和等于target-one的,即可解决这个问题。题目如下:
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets.代码如下:
def threeSum(nums): nums.sort()#排序 def twosum(target, nums,final):#两个数的和等于target,这里的target即为0-第一个加数 if len(nums) < 2: return 0 i=0 j=len(nums)-1 while i !=j: if nums[i]+nums[j]<target: i+=1#指针向大的方向移动 elif nums[i]+nums[j]>target: j-=1#指针向小的方向移动 else: a=[-target,nums[i],nums[j]]#符合要求 i+=1 while nums[i]==nums[i-1]and i!=j: i+=1#防止重复,把使用过的数字也同时排除 final.append(a)#三个数的组合放入最终的列表里 return final result = []#存放最终结果的列表 for i in range(len(nums)-2):#选取第一个加数 if i>0 and nums[i]==nums[i-1]: continue else: newnums=nums[i+1:] target=-nums[i] result=twosum(target,newnums,result) return result4sum再3sum的基础上再套一个循环,即可解决这个问题,代码如下:
class Solution(object): def fourSum( self,nums, target): def threeSum(nums,target): def twosum(target,num,nums,final): i=0 j=len(nums)-1 target0=target-num while i !=j: if nums[i]+nums[j]<target0: i+=1 elif nums[i]+nums[j]>target0: j-=1 else: a=[num,nums[i],nums[j]] i+=1 while nums[i]==nums[i-1]and i!=j: i+=1 final.append(a) return final result = [] for i in range(len(nums)-2): if i>0 and nums[i]==nums[i-1]: continue else: newnums=nums[i+1:] result=twosum(target,nums[i],newnums,result) return result if len(nums) < 4: return [] nums.sort() i = 0 result = [] for i in range(len(nums) - 3): if i>0 and nums[i]==nums[i-1]: continue subsum1 = nums[i] subsum2 = target - subsum1 newlist = nums[i+1:] thresult = threeSum(newlist, subsum2) if len(thresult) > 0: for list in thresult: list.append(subsum1) result.append(list) return result