給定乙個包含 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]
]
我的方法:
總的思路與3sum()類似,也是用迴圈+雙指標,只不過這裡使用的是雙重迴圈。同樣的,在處理時應該注意以下兩個方面:
注意剔除重複項。
當找到滿足條件的專案時,不要忘了移動k,l,否則會進入死迴圈。
執行效率一般:執行用時 : 860 ms, 在4sum的python提交中擊敗了20.70% 的使用者。記憶體消耗 : 10.7 mb, 在4sum的python提交中擊敗了14.94% 的使用者。
class solution(object):
def foursum(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: list[list[int]]
"""nums.sort()
leng=len(nums)# 陣列長度
ans=
if len(nums)<4:
return
# 雙重迴圈
for i in range(leng-3):
for j in range(i+1,leng-2):
k=j+1
l=leng-1
# k,l移動的條件
if i==0 or nums[i]!=nums[i-1]:
while ktarget:
l-=1
elif nums[i]+nums[j]+nums[k]+nums[l]別人的方法:
這套方法看起來有點意思,基本思想是用遞迴把nsum轉換為2sum。還有其它有意思的點:
直接用results記錄結果,子函式findnsum()中的return並不實際返回值,只是相當於break的功能。
依然是要先對nums排序,排序之後很多事情都好辦多了,比如:判斷什麼情況下就不用再接著計算了。
findnsum函式中的nums表示陣列,target表示目標值,n表示相加的數字個數,result表示results[0],results表示最終結果。
速度果然快了許多:執行用時 : 124 ms, 在4sum的python提交中擊敗了84.18% 的使用者。記憶體消耗 : 10.7 mb, 在4sum的python提交中擊敗了14.94% 的使用者。但遞迴應該不是速度更快的原因,應該是其中做了很多的跳過操作,節省了不少的時間。
class solution(object):
def foursum(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: list[list[int]]
"""
nums.sort()
results =
self.findnsum(nums, target, 4, , results)
return results
def findnsum(self, nums, target, n, result, results):
if len(nums) < n or n < 2: return
# solve 2-sum
if n == 2:
l,r = 0,len(nums)-1
while l < r:
if nums[l] + nums[r] == target:
l += 1
r -= 1
# 去重的方式很獨特
while l < r and nums[l] == nums[l - 1]:
l += 1
while r > l and nums[r] == nums[r + 1]:
r -= 1
elif nums[l] + nums[r] < target:
l += 1
else:
r -= 1
else:
for i in range(0, len(nums)-n+1): # careful about range
if target < nums[i]*n or target > nums[-1]*n: # take advantages of sorted list
break
if i == 0 or i > 0 and nums[i-1] != nums[i]: # recursively reduce n
self.findnsum(nums[i+1:], target-nums[i], n-1, result+[nums[i]], results)
return
LeetCode 18 四數之和
給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 ...
LeetCode 18 四數之和
給定乙個包含 n 個整數的陣列nums和乙個目標值target,判斷nums中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與target相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 target ...
leetcode18 四數之和
def foursum nums,target numlen,res,d len nums set if numlen 4 return nums.sort 二層迴圈遍歷任意兩個元素對和存放到字典d裡並把序號存起來 for p in range numlen for q in range p 1,n...