leetcode_18 四数之和

197 阅读1分钟

要求

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • a、b、c 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target 你可以按 任意顺序 返回答案 。

示例 1:

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

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

核心代码

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        self.res = []
        nums.sort()

        def threeSum(nums,t,d):
            l = len(nums)
            res = []
            for i,a in enumerate(nums):
                if i == 0 or nums[i] > nums[i - 1]:
                    left,right = i + 1,len(nums) - 1
                    while left < right:
                        s = a + nums[left] + nums[right]
                        if s == t:
                            tmp = [d,a,nums[left],nums[right]]
                            self.res.append(tmp)
                            left += 1
                            right -= 1
                            while left < right and nums[left] == nums[left - 1]:
                                left += 1
                            while right > left and nums[right] == nums[right + 1]:
                                right -= 1
                        elif s < t:
                            left += 1
                        elif s > t:
                            right -= 1
        
        for i in range(len(nums) - 3):
            if i == 0 or nums[i] > nums[i - 1]:
                threeSum(nums[i + 1:],target - nums[i],nums[i])
        return self.res

image.png

解题思路:我们借用上次的三数之和的思路,我们循环遍历也就是(目标值-当前值),是其余三个数的和,这样调用三数之和的代码,可解四数之和的问题,重点还在三数之和上。