18. 四数之和
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
n = len(nums)
res = []
for i in range(0, n-3):
if i > 0 and nums[i] == nums[i-1]:
continue
# 加速1
if nums[i] + nums[n-3] + nums[n-2] + nums[n-1] < target:
continue
for j in range(i+1, n-2):
if j > i+1 and nums[j] == nums[j-1]:
continue
# 边界错误1
if nums[i] + nums[j] + nums[j+1] + nums[j+2] > target:
break
# 加速2
if nums[i] + nums[j] + nums[n-2] + nums[n-1] < target:
continue
L = j + 1
R = n - 1
while L < R:
four_sum = nums[i] + nums[j] + nums[L] + nums[R]
if four_sum == target:
res.append([nums[i], nums[j], nums[L], nums[R]])
while L < R and nums[L] == nums[L+1]:
L += 1
while L < R and nums[R] == nums[R-1]:
R -= 1
if four_sum > target:
R -= 1
else:
L += 1
return res
思路:
和三数之和思路相同。
综上,时间复杂度O(n^3),空间复杂度是排序需要的额外空间。
注意点:
有两个提前终止的条件可以提高速度。另外边界限制是4个数的和大于target,不然会少结果。