BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #95291同步于 2018/3/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【问题】LeetCode 4sum问题

Ido
2018/3/29镜像同步4 回复
题目:https://leetcode.com/problems/4sum/description/ 我思路是仿照3sum,但对于这个测试实例 nums=[0,0,0,0,0,0] target=0,就是有4个值相同并且恰好这四个值之和就等于target,我写的代码对于这种情况都跳过了,但是不跳过的话又会得到重复的结果,怎么把这种case通过呢?求大佬指点。 另外:对于k-sum问题的时间复杂度是n的k-1次方吗? 代码如下: ``` class Solution: def fourSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[List[int]] """ res=[] nums.sort() for i in range(len(nums)-3): if nums[i]==nums[i-1] and i>0: continue for j in range(i+1,len(nums)-2): if nums[j]==nums[j-1] and j>i: continue l,r=j+1,len(nums)-1 while l<r: s=nums[i]+nums[j]+nums[l]+nums[r] if s<target: l+=1 elif s>target: r-=1 else: res.append([nums[i],nums[j],nums[l],nums[r]]) while l<r and nums[l]==nums[l-1]: l+=1 while l<r and nums[r]==nums[r-1]: r-=1 l+=1 r-=1 return res ```
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
Macaulish64机器人#1 · 2018/3/29
如果k比较小就分类讨论:有1个数值相同的,有两个数值相同的………… 如果k比较大可能得用用组合数学算算重复的
Ido机器人#2 · 2018/3/29
对,还有类似这种情况我这么写也过不去,nums=[0,0,-1,-1] target=0 如果不考虑空间的话,实在不行就用字典判重了, 【 在 Macaulish64 的大作中提到: 】 : 如果k比较小就分类讨论:有1个数值相同的,有两个数值相同的………… : 如果k比较大可能得用用组合数学算算重复的
realWeilai机器人#3 · 2018/3/29
照着你的代码改了两处,就过了: class Solution: def fourSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[List[int]] """ res=[] nums.sort() for i in range(len(nums)-3): if nums[i]==nums[i-1] and i>0: continue for j in range(i+1,len(nums)-2): if nums[j]==nums[j-1] and j>i+1: #这里j要从i+2开始判重, continue l,r=j+1,len(nums)-1 while l<r: s=nums[i]+nums[j]+nums[l]+nums[r] if s<target: l+=1 elif s>target: r-=1 else: res.append([nums[i],nums[j],nums[l],nums[r]]) while l<r and nums[l]==nums[l+1]: # 这里如果是l-1,就会跳过一个数 l+=1 while l<r and nums[r]==nums[r-1]: r-=1 l+=1 r-=1 return res
a940100079机器人#4 · 2018/3/30
import collections class Solution(object): def fourSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[List[int]] """ dict1 = collections.defaultdict(list) for i in range(len(nums)-1): for j in range(i+1,len(nums)): dict1[nums[i]+nums[j]].append([i,j]) two_sum = dict1.keys() result = [] visited = set() for a in two_sum: if a in visited:continue if dict1.has_key(target-a): for index1 in dict1[a]: for index2 in dict1[target-a]: if len(set(index1+index2))<4:continue number = [nums[index] for index in index1 + index2] number.sort() if number in result:continue result.append(number) visited.add(a) visited.add(target-a) return result