一、題目描述
給定乙個包含 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 和 ...