LeetCode 三數之和

2021-09-26 02:52:59 字數 2234 閱讀 6523

15. 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[[-1, 0, 1],

[-1, -1, 2]

]

三元組不可以重複,那我們可以先不考慮是不是重複,而是找到以後都扔到set裡邊去。

找的時候可以先取第乙個數a,然後取第二個數b,計算需要的第三個數的值c,然後在陣列裡找有沒有這個值。可以用map來存放被訪問過的值,這樣就不用重複地去查詢陣列。

public list> threesum(int nums)

if(!map.containskey(nums[j]))//把第二個加入備選

map.put(nums[j],j);}}

list> answer = new arraylist<>(set);

system.out.println("count :" + count);

return answer;

}

執**況:

輸入:

輸出:count :15

-1 2 -1

-1 1 0

能否優化呢?我們可以看到在這裡迴圈進行的次數是15次。也就是說每取乙個first元素,都要遍歷他後面的所有元素。

1.實際上我們通過公升序排序後,就能發現,如果我們前3個數字之和就大於0的話,那再往後取也沒意義了,也不會再有解了,直接結束迴圈。

2.如果我們取當前最小的first,和最大以及次大的元素,他們的和如果小於0的話,說明此時的first也不合適,太小了,直接跳過它去找下乙個比他大一點的first。

3.一開始我們在用set去重,但我們發現排序之後的陣列為,當我們取綠色的-1做first的時候,找到的3元組為,,下乙個first取藍色的-1時,找到的3元組為,也就是說,當相鄰的兩個元素相同時,我們先取的那個元素(綠色-1)得到的解,與後乙個元素能得到的解相同,於是我們在遇到-1時,判斷它上乙個元素是否和他相同,相同就跳過-1這樣我們不會得到重複的解。

public list> threesum(int nums)

if(!map.containskey(nums[j]))//把第二個加入備選

map.put(nums[j],j);}}

system.out.println("count :" + count);

return three;

}

執**況:

輸出:

count :4

-1 1 0

-1 2 -1

可能你發現了,上面這段**其實還有點問題,就是當我們遇到這樣的輸入時,還是會得到兩組,也就是說,當我們選第乙個0和第二個0,我們可以和第3個0得到乙個三元組,然後我們會去檢視第4個0,發現它依舊能和第乙個0以及第二個0進行組合,所以說,還是會得到重複的元組,所以上面的第三部優化沒有真正做到去重(可以用set**:),對於出現多個重複的元素,我們應該怎麼去重呢?

我們可以用雙端指標來做這件事,對於這樣的情況,首先我們選紅0做first,然後在後面的0裡變找剩下兩個元素,設定兩個指標low指向黃0,high指向紫0,我們比較他們3個的和,如果<0,我們把low++,如果大於0,我們把high--,如果等於0,我們就找到了我們要的三元組,於是把它加入結果列表中,此時我們去判斷,low的右邊有沒有和它一樣的元素,有的話low++右移,同時,我們去看high的左邊有沒有和它相同的元素,有的話,high--,直到low>high或者遇到不相同的元素,結束本次操作。

public list> threesum2(int nums)else if(sum < 0) low ++;

else high --;}}

system.out.println("count:" + count);

return three;

}

執行結果:

輸入:

輸出:count:5

0 0 0

leetcode 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 因為這次是要求輸出對應的三...

LeetCode 三數之和

題目描述 給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 題目分析 有序陣...

Leetcode 三數之和

解決方案一 class solution else if nums j nums k target else while i 1 1 i return lllist 解決方案2 class solution 如果有3個0,就直接作為乙個解 if zerosize 3 res.add arrays.a...