• 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)
  • 相关阅读:
    内置对象 和 DropDownList时间年月日的三级联动
    复合控件 ispostback 跨页面传值
    webform简单控件和Repeater的使用
    初步认识ASP.NET WebForm
    WinForm Timer控件,三级联动[省,市,区]
    进程 线程 用户控件
    窗体容器MDI
    对话框控件 MessageBox.Show()用法补充 打开新窗体的3中模式
    winform窗体移动和阴影API
    PS学习笔记
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/10634829.html
Copyright © 2020-2023  润新知