zoukankan      html  css  js  c++  java
  • 1-3

    18.四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

    注意:

    答案中不可以包含重复的四元组。

    示例:

    给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

    满足要求的四元组集合为:
    [
    [-1, 0, 0, 1],
    [-2, -1, 1, 2],
    [-2, 0, 0, 2]
    ]

    Python most votes solution:

    class Solution(object):
        def fourSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[List[int]]
            """
            def findNsum(l, r, target, N, result, results):
                if r-l+1 < N or N < 2 or target < nums[l]*N or target > nums[r]*N:  # early termination
                    return
                if N == 2: # two pointers solve sorted 2-sum problem
                    while l < r:
                        s = nums[l] + nums[r]
                        if s == target:
                            results.append(result + [nums[l], nums[r]])
                            l += 1
                            while l < r and nums[l] == nums[l-1]:
                                l += 1
                            # r -= 1
                            # while l < r and nums[r] == nums[r+1]:
                            #     r -= 1
                        elif s < target:
                            l += 1
                            # while l < r and nums[l] == nums[l-1]:
                            #     l += 1
                        else:
                            r -= 1
                            # while l < r and nums[r] == nums[r+1]:
                            #     r -= 1
                else: # recursively reduce N
                    for i in range(l, r+1):
                        if i == l or (i > l and nums[i-1] != nums[i]):
                            findNsum(i+1, r, target-nums[i], N-1, result+[nums[i]], results)
    
            nums.sort()
            results = []
            findNsum(0, len(nums)-1, target, 4, [], results)
            return results
    

    分析:

    • 该代码提供了一个通用的解决N-sum(N>2,下同)问题的方法:通过截去nums中的一个元素,可以将初始的N-sum问题转化为(N-1)-sum问题,如此不断地截并不断地转化,可以将原问题最终归结为2-sum的问题。

      该程序利用递归的方法实现了此想法。

    • 解决2-sum问题的核心是使用左、右两个指针,通过不断移动指针与不断试探,遍历整个nums数组并最终找出所有符合要求的元素值。

    • while循环会带来额外的运算开销:程序中加注释的部分理论上可以使算法更快,但在实际测试时,发现这些for循环会显著拖慢算法的运算速度,不加这些for循环算法反而更快。

    • 以上实现方法必须是基于有序数组,因此在执行算法时必须要先对nums进行排序。

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/tbgatgb/p/11100023.html
Copyright © 2011-2022 走看看