【leetcode】#数组【Python】18. 4Sum 四数之和

链接:

https://leetcode-cn.com/problems/4sum/

题目:

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

我的解法1: 超时了,在3sum的基础上,增加第二个数的循环

class Solution:
    def fourSum(self, nums, target):
        sol = []
        nums.sort()
        for i in range(len(nums)-3):      
            if (target <=0 and nums[i] <= 0) or target > 0:               
                if i>0 and nums[i] == nums[i-1]:
                    continue               
                for l in range(i+1, len(nums)-2):
                    if l-1 != i and nums[l] == nums[l-1]:
                        continue
                    j = l + 1
                    k = len(nums) - 1
                    while j<k:                       
                        if j-1 != l and nums[j] == nums[j-1]:
                            j += 1
                            continue                   
                        if nums[i]+ nums[l] + nums[j]+nums[k] == target:                            sol.append([nums[i],nums[l],nums[j],nums[k]])
                            j += 1
                            k -= 1                     
                        elif nums[i]+ nums[l] + nums[j]+nums[k] < target:
                            j += 1
                        elif nums[i]+ nums[l] + nums[j]+nums[k] > target:
                            k -= 1
        return sol
        

我的解法2: 优化了下,80ms,超越94%

class Solution:
    def fourSum(self, nums, target):
        sol = []
        nums.sort()
        for i in range(len(nums)-3):
        	# target在当前nums[i]能到达的最大最小范围内,筛掉了一波i
            if target >= (nums[i]+nums[i+1]+nums[i+2]+nums[i+3]) and target<=(nums[i]+nums[len(nums)-3]+nums[len(nums)-2]+nums[len(nums)-1]):
                # 去重,i从1开始;如果两个相连的数相等的话,第二个的结果被包含
                if i>0 and nums[i] == nums[i-1]:
                    continue
                for l in range(i+1, len(nums)-2):
                    # target在当前i,当前j对应的nums范围内,筛选一波j
                    if (nums[i]+ nums[l] + nums[l+1]+nums[l+2]) <= target and (nums[i]+ nums[l] + nums[len(nums)-2]+nums[len(nums)-1]) >= target:
                    	# 去重
                        if l-1 != i and nums[l] == nums[l-1]:
                            continue
                        # j从前,k从后,
                        j = l + 1
                        k = len(nums) - 1
                        while j<k:
                        	# 去重
                            if j-1 != l and nums[j] == nums[j-1]:
                                j += 1
                                continue
                            temp = nums[i]+ nums[l] + nums[j]+nums[k]
                            if temp == target:
                                sol.append([nums[i],nums[l],nums[j],nums[k]])
                                j += 1
                                k -= 1
                            elif temp < target:
                                j += 1
                            elif temp > target:
                                k -= 1
        return sol

别人的解法:

class Solution(object):
	def fourSum(self, nums, target):
		def nSum(nums, target, n, result, results):
			length = len(nums)
			if(len(nums)<n or n<2 or n*nums[0]>target or n*nums[length-1]<target):
				return []
				
			if n==2:
				begin, end = 0, length-1
				while begin<end:
					sums = nums[begin]+nums[end]
					if(sums<target):
						begin += 1
					elif(sums>target):
						end -= 1
					else:
						temp = [nums[begin], nums[end]]
						results.append(result + temp)
						while begin<end and nums[begin]==temp[0]:
							begin += 1
						while begin<end and nums[end]==temp[1]:
							end -= 1
							
			else:
				for i in range(length - n + 1):
					if(i>0 and nums[i]==nums[i-1]):
						continue
					if n*nums[i]>target:
						break
					nSum(nums[i+1 : ], target-nums[i], n-1, result+[nums[i]], results)
			
		results = []
		nums.sort()
		nSum(nums, target, 4, [], results)
		return results
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值