Leetcode No 18 四數之和

2021-10-25 10:36:21 字數 1422 閱讀 4262

一、題目描述

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

]二、解題思路

最樸素的方法是使用四重迴圈列舉所有的陣列,然後使用雜湊表進行去重操作,得到不包含重複四元組的最終答案。假設陣列的長度是 n,則該方法中,列舉的時間複雜度為 o(n^4),去重操作的時間複雜度和空間複雜度也很高,因此需要換一種思路。

將陣列中的兩兩元素加起來,放在乙個雜湊表中,key為加和,value為兩兩元素的下標

雙層for迴圈遍歷陣列,再加一層迴圈遍歷雜湊表,當nums[i]+num[j]+雜湊表的key(兩兩元素的和)=target,將相應的下標 i,j,雜湊表的value(兩兩元素的下標),放入結果表。

三、**

class solution:

def foursum(self, nums: list[int], target: int) -> list[list[int]]:

d={}

for i in range(len(nums)):

for j in range(i+1,len(nums)):

result=set()

for i in range(len(nums)):

for j in range(i+1,len(nums)):

for a,b in d.get(target-nums[i]-nums[j],):

temp=

if len(temp)==4:

result.add(tuple(sorted(nums[t] for t in temp)))

return list(result)

四、複雜度分析

時間複雜度:o(n^2),

其中n為陣列長度。排序的時間複雜度是o(nlogn);構建hash table的時間複雜度是o(n^2);列舉前兩個數以及查詢hash表的時間複雜度是o(n^2*k),k表示乙個「和」的可能組合的平均個數,在構建hash表時,重複的數對只會儲存最大的一對下標,因而k空間複雜度:o(n^2),

其中n為陣列長度。排序的空間複雜度是o(logn);hash表的空間複雜度是o(n^2)。因此總空間複雜度為o(n^2+logn)=o(n^2)

18 四數之和

給定乙個含有 n 個整數的陣列 s,數列 s 中是否存在元素 a,b,c 和 d 使 a b c d target 請在陣列中找出所有滿足各元素相加等於特定值 的不重複組合。注意 解決方案集不能包含重複的四元組合。例如,給定陣列 s 1,0,1,0,2,2 並且給定 target 0。示例答案為 1...

18 四數之和

給定乙個包含 n 個整數的陣列nums和乙個目標值target,判斷nums中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與target相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 target ...

18 四數之和

給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 ...