目錄
前言:
由於不太清楚官方給出的C代碼接口格式,所以本題使用C#進行解答。
題目:
給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定數組 nums = [-1, 0, 1, 2, -1, -4],滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]
解題過程:
public class Solution {
public IList<IList<int>> ThreeSum(int[] nums) {
IList<IList<int>> ret = new List<IList<int>>();
Array.Sort(nums);
for(int i = 0; i < nums.Length; i++)
{
int m = i + 1;
int n = nums.Length - 1;
if(i == 0 || nums[i] != nums[i-1])
{
while (m < n)
{
int sum = nums[i] + nums[m] + nums[n];
if (sum == 0)
{
ret.Add(new List<int> { nums[i], nums[m], nums[n] });
m++;
n--;
while (m < n && nums[m] == nums[m - 1]) m++;
while (m < n && nums[n] == nums[n + 1]) n--;
}
else if (sum < 0)
{
m++;
}
else if (sum > 0)
{
n--;
}
}
}
}
return ret;
}
}
解題結果:
解題思路:
本題的難點不在於尋找三數相加爲0的三元組,難點在於去除重複的三元組。本題在解決過程中的思路如下:
- 先將傳入數據進行排序
- 開始從頭遍歷,尋找三數和爲0的值
- 遍歷過程中,先鎖定第一個值,記其索引爲i。同時還應對除nums[0]外的所有元素進行去重操作,即當nums[i]==nums[i-1]時,不進行查找
- 從m = i+1向右遍歷第二個值,n = nums.Length-1向左遍歷第三個值
- 由於輸入數組已經排序,記三數之和爲sum
- sum==0時,即可記下此時的nums[i], nums[m], nums[n]。同時對左右兩側的指針索引進行自增和自減操作。並且還要分別對左右兩側分別去除相同數值
- sum>0時,對向右索引指針自增
- sum<0時,對向左索引指針自減