給予一組數列 找出任意三個數字相加等於0的組合
完全都是用wiki上的O(n2)解法
解說
我認為這個做法重要的地方在於Sort 但是把Sort算進去還能算O(n2)嗎?
選定第一個數當作定錨,然後再找出剩下的頭(start)尾(end)相加判斷是否大於小於或等於0
如果比較大 那就代表end 的數值太大 往前找小一點的 所以end--
如果比較小 就代表start太小 往前移一位 start++
如此重複..
程式碼
List<int> input = new List<int>() { 1, 2, 3, 4, 5 ,-5,-6,-7,-1,-3,-2,-8};
input.Sort();
for (int i = 0; i < input.Count-3; i++)
{
int a = input[i];
int start = i + 1;
int end = input.Count - 1;
while (start < end)
{
int b = input[start];
int c = input[end];
if (a + b + c == 0)
{
Console.WriteLine($"{a},{b},{c}");
end--;
}
else if (a + b + c > 0)
end--;
else
start++;
}
}
輸出結果
Reference
https://zh.wikipedia.org/wiki/3SUM