15 三數之和

2021-09-24 05:12:24 字數 1181 閱讀 5750

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

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

例如:

nums = [-1, 0, 1, 2, -1, -4]

output :

[ [-1,1,0],

[-1,-1,2]

]

本文採取的方法是排序加對撞指標,首先我們不考慮邊界情況,固定乙個數,設其下標為i,然後選定左指標l,右指標r。l為i + 1,r為陣列的最後乙個下標。當nums[l]+nums[r]+nums[i] = 0時就說明著,這是我們需要的一組資料。如果nums[l] + nums[r] + numsp[i] < 0時我們需要將l右移,當其大於零時,我們需要將其r左移。當l <=r時結束迴圈。i 移動。

但如何排除題目中所提的重複的三元組呢?我們思考下,什麼情況下會出現相同的三元組?一當nums[i] = nums[i-1]時(不考慮邊界情況),當nums[l] = nums[l + 1] 、nums[r] = nums[r - 1]時三種情況會出現三元組重複,我們寫出判斷語句將其排除就好了。

還有,如果nums[i]>0的話可以終止迴圈,因為nums[i]是最小的,如果最小的都大於零,就沒有進行計算的必要了。

class solution ;

sort(nums.begin(),nums.end());

for(int i=0;i0) break;//大於0的話直接退出,因為拿的是最小的

if(i>0 && num1 == nums[i-1])//去除相同陣列元素

continue;

//對撞指標

int l = i+1;

int r = nums.size() - 1;

while(l);

l++;

r--;

}else if(nums[l]==nums[l-1])l++;

else if(nums[r]==nums[r+1]) r--;

else

);l++,r--;}}

else if(nums[l]+nums[r]+num1>0) r--;//需要往右移

else l++;}}

return res;

}};

15 三數之和

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

15 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。有兩種寫法 第一種耗時久,但容易解讀 class solution if nums.length 3 else if ...

15 三數之和

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