思路:leecode16是三数之和,这题可以借鉴,将四数之和转化为三数之和。
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
res = []
for i in range(len(nums)):
for j in range(i+1,len(nums)): #多加一层循环
p1 = j+1
p2 = len(nums)-1
while p1 < p2:
c = nums[i] + nums[j] + nums[p1] + nums[p2]
if c == target and [nums[i],nums[j],nums[p1],nums[p2]] not in res: #多加一个判断条件去重
res.append([nums[i],nums[j],nums[p1],nums[p2]])
p1 += 1
# p2 -= 1
elif c < target:
p1 += 1
else:
p2 -= 1
return res
注:不加判断条件的话,返回也可写成 return list(set(map(tuple,res)))
写法二:同样也是转化为3数之和,但这个想法和我自己的不太一样,代码也简洁得多
class Solution:
def fourSum(self, nums):
nums.sort()
length=len(nums)
ans=[]
for i in range(length):
for j in range(i+1,length):
l,r,t=j+1,length-1,target-nums[i]-nums[j]
while l<r:
while l<r and t>nums[l]+nums[r]: l+=1 #此处nums[l]和nums[r]是在变化的
while l<r and t<nums[l]+nums[r]: r-=1
if l<r and nums[l]+nums[r]==t:
ans.append([nums[i],nums[j],nums[l],nums[r]])
l+=1
return list(set(map(tuple,ans)))