给定一个包含 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]
]
解题思路
这个问题其实和Leetcode 15:三数之和(最详细解决方案!!!)类似,所以我们可以直接参考这篇文章中的做法。
我们首先想到的做法就是暴力解法
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
result = []
for i, a in enumerate(nums):
for j, b in enumerate(nums[i + 1:]):
for k, c in enumerate(nums[j + i + 2:]):
for _, d in enumerate(nums[i + j + k + 3:]):
if a + b + c + d == 0:
result.append([a, b, c, d])
return result
暴力解法是如此的简洁( ̄▽ ̄)",但是正如大家所知,这种做法的时间复杂度时O(n^4)
级别的。我们能不能优化为O(n^3)
级别呢?
我们可以将d
中的元素都放入查找表,这样我们只需要遍历a\b\c
三个数组,之后在查找表中查找0 - a - b - c
就可以将问题解决,我这里就不再赘述地代码。
我们还不满足,有没有更快的解法?有!!!
我们可以参考Leetcode 15:三数之和(最详细解决方案!!!)文章中的对撞指针
的思路
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
result = list()
nums_len = len(nums)
nums.sort()
for i in range(nums_len - 3):