leetcode 四数之和
这里我们可以考虑将 n 数之和降低为一个数加上 n-1 数之和的问题。依次降低 ,最低是二数之和的问题 ,二数之和问题容易解决。
主要在于从 n 到 n-1 的过程需要理解 :下列代码中前几个 if 是对特殊情况的处理 ;通过新的 target = target - nums[i] 进行参数修改再次调用 nsum()方法即递归 。
def nsum(nums, target, n, result, results): #求n数之和=target if len(nums) < n or n < 2 or target < nums[0]*n or target > nums[-1]*n: return [] if n==2: begin,end = 0,len(nums)-1 while begin<end: sums = nums[begin]+nums[end] if sums<target: begin += 1 elif sums>target: end -=1 else: plet = [nums[begin],nums[end]] results.append(result+plet) while begin<end and nums[begin] ==plet[0]:begin += 1 #重复数字跳过 while begin<end and nums[end] == plet[1]:end -=1 #重复数字跳过 else: for i in range(len(nums)-n+1): if (i>0 and nums[i]==nums[i-1])or(nums[i]+(n-1)*nums[len(nums)-1]<target): continue if n*nums[i]>target: break if n*nums[i] == target and i+n-1 <len(nums) and nums[i+n-1] == nums[i]: plet = [nums[i]]*n results.append(result+plet) break else: nsum(nums[i+1:],target-nums[i],n-1,result+[nums[i]],results) #递归,这里注意第一个参数是nsum[i+1:],敲代码易敲错为nsum[i+1] if __name__ == '__main__': results = [] nums = [1, 0, -1, 0, -2, 2] nums.sort() target = 0 nsum(nums,target,4,[],results) #n=4,即求4数之和=0(target) print(results)