給定乙個包含 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]
]解法1:
排序雙指標
避免重複統計
但是力扣提交 超出時間限制
class
solution
:def
foursum
(self, nums: list[
int]
, target:
int)
-> list[list[
int]]:
result =
# 排序
nums.sort(
)
n =len(nums)
for i in
range
(n):
# 避免重複統計
if i >
0and nums[i]
== nums[i -1]
:continue
for j in
range
(i +
1, n)
:# 避免重複統計
if j > i +
1and nums[j]
== nums[j -1]
:continue
left = j +
1 right = n -
1while left < right:
sum= nums[i]
+ nums[j]
+ nums[left]
+ nums[right]
ifsum
== target:
[nums[i]
, nums[j]
, nums[left]
, nums[right]])
elif
sum< target:
left +=
1# 避免重複統計
while nums[left]
== nums[left -1]
and left < right:
left +=
1else
: right -=
1# 避免重複統計
while nums[right]
== nums[right +1]
and left < right:
right -=
1return result
解法2:
class
solution
:def
foursum
(self, nums: list[
int]
, target:
int)
-> list[list[
int]]:
res =
set(
)# 排序
nums.sort(
)
n =len(nums)
# 字典 key是兩數之和 value是列表 存的是乙個個元組 元組中兩索引代表的兩數之和為key
dict
=for i in
range
(n):
for j in
range
(i +
1, n)
: key = nums[i]
+ nums[j]
if key in
dict
.keys():
dict
[key]
(i, j)
)else
:dict
[key]=[
(i, j)
]for i in
range
(n):
for j in
range
(i +
1, n -2)
:
key = target - nums[i]
- nums[j]
if key in
dict
.keys():
index_list =
dict
[key]
for index in index_list:
# index中的兩索引必須大於此迴圈中的兩索引
if index[0]
> j:
res.add(
(nums[i]
, nums[j]
, nums[index[0]
], nums[index[1]
]))return
[list
(i)for i in res]
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 和 target 0。滿足要求的四元組集合為 ...