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)
原文地址:https://www.cnblogs.com/USTC-ZCC/p/10634829.html