LeetCode 四數之和

2021-09-16 12:30:36 字數 1926 閱讀 5552

給定乙個包含 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 可以反回,但不能多次返回 ...