題目:給定乙個包含 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 分析排序 雙指標避免...