LeetCode 4Sum

LeetCode解题之4Sum

原题

找出一个列表中四个元素之和为目标值的情况,打印出所有的情况。

注意点:

  • 四元组中的数字要按增序排列(a<=b<=c)
  • 结果集中没有重复的四元组

例子:

输入: nums=[1, 0, -1, 0, -2, 2]
输出: [[-1, 0, 0, 1], [-2, 0, 0, 2], [-2, -1, 1, 2]]

解题思路

想参照之前的一题3Sum的解法来解决,结果超时了。换个思路,空间换时间。既然有四个数,那就把前两个数之和和后两个数之和分别当做一个数。现在要求的就是在一个列表中哪两个数的和为特定值。可以先遍历一遍列表,存值和它的下标的键值对,第二遍遍历列表寻找(目标值-当前值)是否在之前的键值对中,如果在就是符合的一组解。

AC源码

class Solution(object):
    def fourSum(self, nums, target):
        """ :type nums: List[int] :type target: int :rtype: List[List[int]] """
        if len(nums) < 4:
            return []
        result = set()
        sumsIndexes = {}
        # Get all two elements' sum and indexes map
        for i in range(len(nums)):
            for j in range(i + 1, len(nums)):
                if nums[i] + nums[j] in sumsIndexes:
                    sumsIndexes[nums[i] + nums[j]].append((i, j))
                else:
                    sumsIndexes[nums[i] + nums[j]] = [(i, j)]

        for i in range(len(nums)):
            for j in range(i + 1, len(nums)):
                sumNeeded = target - (nums[i] + nums[j])
                if sumNeeded in sumsIndexes:
                    for index in sumsIndexes[sumNeeded]:
                        # Ingore repeating results
                        if index[0] > j:
                            result.add(tuple(sorted([nums[i], nums[j], nums[index[0]], nums[index[1]]])))
        # Format result with list[list] pattern
        result = [list(l) for l in result]
        return result


if __name__ == "__main__":
    assert Solution().fourSum([1, 0, -1, 0, -2, 2], 0) == [[-1, 0, 0, 1], [-2, 0, 0, 2], [-2, -1, 1, 2]]

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

你可能感兴趣的:(LeetCode,算法,python,求和)