zoukankan      html  css  js  c++  java
  • LeetCode18四数之和扩展N数之和

    # coding:utf-8
    """
    Name : LeetCode18.py
    Author  : qlb
    Contect : 17801044486@163.com
    Time    : 2021/2/6 21:30
    Desc: 四数之和 扩展到 n数之和
    """
    from typing import List
    
    '''
    对于三数之和,可以依次固定第一个数,然后解决两数之和的问题。那么,对于n数之和,也可以采用同样的思路,依次固定数据,
    不断缩小问题的规模,最基本的情况还是两数之和问题,所以可以采用递归算法解决n数之和问题。
    
    如果n==2,两数之和问题,正常求解;
    如果n>2,则遍历固定第一个数,解决更小规模的n-1数之和的问题;
    注意跳过数据重复的情况即可;
    
    '''
    class Solution:
        def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
            if len(nums) <= 3:
                return []
            nums.sort()
            res = self.nSum(nums,4,target)
            return res
        def nSum(self,nums,n,target):
            if len(nums) < n:
                return []
             # 放在 判断语句的外部
            if n == 2:
                res = []
                left_idx = 0
                right_idx = len(nums) - 1
                while left_idx < right_idx:
                    if nums[left_idx] + nums[right_idx] == target:
                        res.append([nums[left_idx],nums[right_idx]])
                        while left_idx < right_idx and nums[left_idx + 1] == nums[left_idx]:
                            left_idx += 1
                        while left_idx < right_idx and nums[right_idx ] == nums[right_idx - 1]:
                            right_idx -= 1
                        left_idx += 1
                        right_idx -= 1
                    elif nums[left_idx] + nums[right_idx] > target:
                        right_idx -= 1
                    else:
                        left_idx += 1
                return res
            else:
                res = []
                for first_idx in range(len(nums)):
                    if first_idx > 0 and nums[first_idx] == nums[first_idx - 1]:
                        continue
                    subRes = self.nSum(nums[first_idx + 1:], n - 1, target - nums[first_idx])
                    for sub in subRes:
                        res.append([nums[first_idx]] + sub)
                return res
    
    test = Solution()
    res = test.fourSum([1, 0, -1, 0, -2, 2],0)
    print (res)
  • 相关阅读:
    java 开发webservice
    myeclipse下jsp页面汉字不能保存问题
    java web项目的部署
    Java小白手记:WEB项目等
    操作系统学习笔记:虚拟内存
    面向接口编程
    WEB端应该使用DataTable/DataSet吗?
    ExtJs grid合并单元格
    操作系统学习笔记:内存管理
    Oracle中长度为0字符串与null等价
  • 原文地址:https://www.cnblogs.com/cnugis/p/14383358.html
Copyright © 2011-2022 走看看