lintcode练习-58. 四数之和

描述

给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。

四元组(a, b, c, d)中,需要满足a <= b <= c <= d

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

您在真实的面试中是否遇到过这个题?  是

样例

例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:

(-1, 0, 0, 1)

(-2, -1, 1, 2)

(-2, 0, 0, 2)

 

实现代码:

将问题分解,求四数之和分解成求三数之和,然后在分解成求两数之和。

class Solution:
    res = set()
    """
    @param numbers: Give an array
    @param target: An integer
    @return: Find all unique quadruplets in the array which gives the sum of zero
    """
    def fourSum(self, numbers, target):
        # write your code here
        numbers.sort()
        right = len(numbers) - 1
        for a in range(len(numbers) - 3):
            if a > 0 and  numbers[a-1] == numbers[a]:
                continue
            left = a+1
            self.threeSum(numbers, left, right, numbers[a], target)
        
        return list(self.res)
    
    
    def threeSum(self, numbers, left, right, first, target):
        #b+c+d = target - a
        target = target - first
        for a in range(left, right+1):
            if a>left and numbers[a] == numbers[a-1]:
                continue
            left = a + 1
            self.towSum(numbers, left, right, first, numbers[a], target)
            
    
    def towSum(self, numbers, left, right, first, second, target):
        #c+d = target - b
        target = target - second
        while left < right:
            if numbers[left] + numbers[right] == target:
                self.res.add((first, second, numbers[left], numbers[right]))
                left, right = left + 1, right - 1
                
                while left < right and numbers[left] == numbers[left-1]:
                    left += 1
                while left < right and numbers[right] == numbers[right+1]:
                    right -= 1
            
            elif numbers[left]+numbers[right] < target:
                left += 1
            else:
                right -= 1
                
            
            
            
            
        
        
 

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/81429070