Leetcode 18 四數之和

2021-09-19 06:42:09 字數 2627 閱讀 1532

給定乙個包含 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...