4sum

基于3-sum 但是时间不行了:

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        nums.sort()
        if len(nums) < 4:
            return []
        if len(nums) ==  4:
            if nums[0] + nums[1] + nums[2] + nums[3] == target:
                return [[nums[0],nums[1],nums[2],nums[3]]]
            else:
                return []
        i = 0
        res = []
        while i < len(nums) - 3:
            j = i + 1
            while j < len(nums) - 2:
                m = j + 1
                n = len(nums) - 1
                while m < n:
                    if nums[i] + nums[j] + nums[m] + nums[n] < target:
                        m += 1
                    elif nums[i] + nums[j] + nums[m] + nums[n] > target:
                        n -= 1
                    else:
                        res.append([nums[i],nums[j],nums[m],nums[n]])
                        m += 1
                        n -= 1
                    while m < n and m != j + 1 and nums[m] == nums[m-1]:
                        m += 1
                    while m < n and n != len(nums) - 1 and nums[n] == nums[n+1]:
                        n -= 1
                while j < len(nums) - 2 and nums[j] == nums[j+1]:
                    j += 1
                j += 1
            while  i < len(nums) - 3 and nums[i] == nums[i+1]:
                i += 1
            i += 1
        return res

第二种解法ac:
两两数字之和存到字典中,value为下标组成的远足
两重循环扫描list,target - 和存在字典中,如果字典中元祖下标大于j,那么添加数组的值

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        res = []
        dic = {}
        for p in range(len(nums) - 1):
            for q in range(p+1,len(nums)):
                if nums[p] + nums[q] not in dic:
                    dic[nums[p] + nums[q]] = [(p,q)]
                else:
                    dic[nums[p] + nums[q]].append((p,q)) 
        for i in range(len(nums) - 3):
            for j in range(i+1,len(nums) - 2):
                t = target - nums[i] - nums[j]
                if t in dic:
                    for k in dic[t]:
                        if k[0] > j:
                            temp = [nums[i],nums[j],nums[k[0]],nums[k[1]]]
                            temp.sort()
                            if temp not in res:
                                res.append(temp)
        return res

你可能感兴趣的:(4sum)