從 兩數之和 四數之和(LeetCode)

2021-10-08 22:57:35 字數 1427 閱讀 1707

兩數則固定乙個元素+指標;

三數則固定兩個元素+雙指標;

四數則固定乙個元素+三數和。

因為提前將陣列排序過,所以若當前和》target,則l--;

若當前和若當前和==target,則return或儲存。

陣列中元素可以重複,但是不能反回相同的答案,如[1,1,1,2],target=3;可以反回,但不能多次返回[1,1,1] 以及 [1,2]。這時去掉首元素的重複元素: 

while(i>0 && nums[i]==nums[i-1])i++;

//或者

if(i>0 && nums[i]==nums[i-1])continue;

同時如果找到了和==target的n元素,那麼也需要去重,即:n個資料需要去重n次,固定的數用首元素去重的方法,雙指標指向的數在找到和==target之後去重:

while(i>0 && nums[i]==nums[i-1])i++;

//或者

if(i>0 && nums[i]==nums[i-1])continue;

//以三數為例

while(l1. 兩數之和

兩數之和這個題目,如果要求返回的是元素不是下標,那麼可以用指標來解。

class solution else return ;

}return {};

}};

2.三數之和

三數之和且不包含重複元素,那麼可以固定乙個數,另外兩個利用當前和與target的大小移動雙指標確定,同時在首元素和中間元素都去重。這道題確定了target=0。

class solution );

while(nums[r]==nums[r-1] && l3.四數之和

四數之和就是固定兩個數,再使用雙指標,多了一層迴圈巢狀。

class solution 

else if(ans5.三數之和的多種可能

核心還是固定乙個數+雙指標的移動,但是這裡需要注意幾個小細節,非常非常重要:

1)題目中沒有說去掉重複元素,但是不去重直接計算會超時(不要問我怎麼知道的),所以需要計算有幾個重複的中間元素,相乘即可;

2)餘數的可加性:a與b的和除以c的餘數,等於a,b分別除以c的餘數之和(或這個和除以c的餘數)。所以可以先求餘數再計算相加;

3)需要注意的是sum的位置,因為l和r指標是不斷變化的,所以他一定是在while迴圈內;

4)注意此時while的條件,不再是l& a, int target)

}if(a[l]==a[r] && a[l]+a[r]==target-a[i])

}return ans;

}};

同理,如果五數之和就可以固定三個數,再用雙指標。

細節決定成敗,思路都對,測試也過了,就是提交不成功,這種感覺真的很難受,小菜雞還是一步步慢慢來吧。

javascript 四數之和LeetCod 18

給定乙個包含 n 個整數的陣列nums和乙個目標值target,判斷nums中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與target相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。var foursum function nums,target 先...

兩數之和 三數之和 四數之和

兩數之和意思就是 給你乙個陣列,從中找出兩個數字,讓他們的和等於乙個具體的target。找到所有這樣的兩個數。並且這兩個數字不能完全一樣。n數之和的意思是 給你乙個陣列,從中找出n個數字,讓他們的和等於乙個具體的target。找到所有這樣的n個數。並且這n個數字不能完全一樣。最基礎的,也是最關鍵的就...

演算法 兩數之和,三數之和,四數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...