1.4.8 #
解答 #
平方级别:直接二层循环遍历一遍。
线性对数:
先对数组排序,然后遍历一遍数组,在遍历过程中计算重复元素的数量,
然后用公式 $1+2+\cdots+n-1=n(n-1)/2$ 计算重复整数对的数量。
代码 #
/// <summary>
/// 暴力查找数组中相等的整数对。
/// </summary>
/// <param name="a">需要查找的数组。</param>
/// <returns></returns>
static int CountEqual(int[] a)
{
var n = a.Length;
var count = 0;
for (var i = 0; i < n; i++)
{
for (var j = i + 1; j < n; j++)
{
if (a[i] == a[j])
count++;
}
}
return count;
}
/// <summary>
/// 利用 Array.Sort 进行优化的查找相等整数对算法。
/// </summary>
/// <param name="a">需要查找的数组。</param>
/// <returns></returns>
static int CountEqualLog(int[] a)
{
var n = a.Length;
var count = 0;
Array.Sort(a);
var dup = 0; // dup = 重复元素数量-1
for (var i = 1; i < n; i++)
{
while (a[i - 1] == a[i])
{
dup++;
i++;
}
count += dup * (dup + 1) / 2;
dup = 0;
}
return count;
}