1.4.14 #
解答 #
这里给出暴力方法,将最内侧循环换成二分查找即为优化版本。
代码 #
public static class FourSum
{
/// <summary>
/// 输出数组中所有和为 0 的四元组。
/// </summary>
/// <param name="a">包含所有元素的数组。</param>
public static void PrintAll(long[] a)
{
var n = a.Length;
for (var i = 0; i < n; i++)
{
for (var j = i + 1; j < n; j++)
{
for (var k = j + 1; k < n; k++)
{
for (var l = k + 1; l < n; l++)
{
if (a[i] + a[j] + a[k] + a[l] == 0)
{
Console.WriteLine($"{a[i]} + {a[j]} + {a[k]} + {a[l]} = 0");
}
}
}
}
}
}
/// <summary>
/// 计算和为零的四元组的数量。
/// </summary>
/// <param name="a">包含所有元素的数组。</param>
/// <returns>和为零的四元组的数量。</returns>
public static int Count(long[] a)
{
var n = a.Length;
var cnt = 0;
for (var i = 0; i < n; i++)
{
for (var j = i + 1; j < n; j++)
{
for (var k = j + 1; k < n; k++)
{
for (var l = k + 1; l < n; l++)
{
if (a[i] + a[j] + a[k] + a[l] == 0)
{
cnt++;
}
}
}
}
}
return cnt;
}
}