【LeetCode】18. 4Sum Closest 解题报告(Python)

题目分析:

这道题目与3Sum类似,只是变成了4Sum,可以再3Sum外加一层循环解决,在网上看到了另一种解法,先两两相加存到字典里,再双循环让目标减去两个数看结果是否在字典里,时间复杂度由O(n3)变为O(n2),所以我提供两种解法。第一种方法使用了字典,用空间换取时间,消耗大概是160ms,第二种消耗大概是1000ms。

第一种:字典查询法

代码说明:

1、双循环生成字典

for i in range(l):
            for j in range(i + 1, l):
                sum = nums[i] + nums[j]
                if sum not in dict:
                    dict.update({sum: [(i, j)]})
                else:
                    dict[sum].append((i, j))

2、为了保证加入的顺序,p一定小于q,t[0]一定小于t[1],所以只需q小于t[0]即可保证p<q<t[0]<t[1],这样方便set去重
if q < t[0]:res.add((nums[p], nums[q], nums[t[0]], nums[t[1]]))
3、set转list
[list(i) for i in res]
测试代码:

class Solution:
    def fourSum(self, nums, target):
        nums.sort()
        l, res, dict = len(nums), set(), {}
        if l < 4:return []
        for i in range(l):
            for j in range(i + 1, l):
                sum = nums[i] + nums[j]
                if sum not in dict:
                    dict.update({sum: [(i, j)]})
                else:
                    dict[sum].append((i, j))
        for p in range(l):
            for q in range(p + 1, l - 2):
                goal = target - nums[p] - nums[q]
                if goal in dict:
                    for t in dict[goal]:
                        if q < t[0]:res.add((nums[p], nums[q], nums[t[0]], nums[t[1]]))
        return [list(i) for i in res]

print(Solution().fourSum([-1,0,1,2,-1,-4], -1)) #提交时请删除该行

第二种:多层循环加指针

代码说明:
这个没什么好说的多加一层循环,和一层用去去重的判断,如果不懂可以参考3Sum结题报告
for p in range(l):
if p > 0 and nums[p] == nums[p - 1]: continue
测试代码

class Solution:
    def fourSum(self, nums, target):
        if not nums: return nums
        nums.sort()
        l = len(nums)
        res = []
        for p in range(l):
            if p > 0 and nums[p] == nums[p - 1]: continue
            for i in range(p+1, l):
                if i > p+1 and nums[i] == nums[i-1]: continue
                goal = target - nums[p] - nums[i]
                j, k = i + 1, l - 1
                while(j < k):
                    if nums[j] + nums[k] == goal:
                        res.append([nums[p], nums[i], nums[j], nums[k]])
                        while j < k and nums[j] == nums[j + 1]: j += 1
                        while j < k and nums[k] == nums[k - 1]: k -= 1
                        j += 1
                        k -= 1
                    elif nums[j] + nums[k] < goal: j += 1
                    else: k -= 1
        return res

print(Solution().fourSum([1,-2,-5,-4,-3,3,3,5], -11))   #提交时请删除该行

参考博客

猜你喜欢

转载自blog.csdn.net/L141210113/article/details/88063752