給定乙個包含 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]
]求四數之和可以使用暴力的方法來破解,複雜度為四次for迴圈,很不推薦。我們這裡用到字典進行陣列對的儲存。
這裡讀取的方式採用牛客網的讀取,第乙個數字為目標求和數字,後面為數字集合。這個解法也是網上目前比較優的一種解法。
my_input =
'0,1,0,-1,0,1,-1,-2,2'
a =list
(map
(int
, my_input.split(
',')))
#a = list(map(int, input().split(',')))
kk = a.pop(0)
# 讀入序列的第乙個數字為target
n =len
(a)a.sort(
)# 先進行排序
rest =
set(
)# 構造剩餘集合
dic =
# 構造記錄兩數求和的字典
#for i in range(n - 3):
# for j in range(i + 1, n - 2):
# for k in range(j + 1, n - 1):
# for l in range(k + 1, n):
# if (kk - a[i] - a[j] - a[k] - a[l]) == 0:
# rest.add((a[k[0]], a[k[1]], a[i], a[j]))
for i in
range
(n -1)
:for j in
range
(i +
1, n)
: num = a[i]
+ a[j]
# 先記錄兩個數字求和的所有情況,記錄在字典中
if num in dic:
dic[num]
(i, j)
)else
: dic[num]=[
(i, j)
]# 若沒有在字典中,則開闢新的位置儲存
for i in
range(2
, n -1)
:# 再次遍歷
for j in
range
(i +
1, n)
: res1 = kk -
(a[i]
+ a[j]
)# 記錄離目標還差多少
if res1 in dic:
# 先判斷還差的數字是否能由陣列中的數字組合而成
for k in dic[res1]
:# 遍歷還差多少,那個數字的所有集合
if k[1]
< i:
# 若能組合而成,還需判斷原本求的兩個與新的兩個數字不重合(原本大的那個數字要小於現在小的那個數字,則無重合)
rest.add(
(a[k[0]
], a[k[1]
], a[i]
, a[j]))
print
(rest)
# print(len(rest)) # 最後計算去重後的組合個數
leetCode四數之和
18.給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2...
Leetcode 兩數之和,三數之和,四數之和
兩數之和的思想比較簡單啦 就是 使用乙個map儲存其值,然後將其下標返回即可 三數之和 四數之和的思想比較類似,就是使用雙指標的思想 三數之和的 如下所示 四數之和的 如下 有一些優化 四數之和是在三數之和的基礎上增加了一層迴圈,class solution 獲取當前最大值 int max1 num...
從 兩數之和 四數之和(LeetCode)
兩數則固定乙個元素 指標 三數則固定兩個元素 雙指標 四數則固定乙個元素 三數和。因為提前將陣列排序過,所以若當前和 target,則l 若當前和若當前和 target,則return或儲存。陣列中元素可以重複,但是不能反回相同的答案,如 1,1,1,2 target 3 可以反回,但不能多次返回 ...