1.4.12 #
解答 #
由于两个数组都是有序的,可以同时进行比较。
设 i, j 分别为两个数组的下标。
如果 a[i] == a[j],i 和 j 都向后移动一位。
如果 a[i] != a[j],比较小的那个向后移动一位。
循环直到某个数组遍历完毕。
这样最后的时间复杂度 ~2N
代码 #
var a = new[] { 2, 3, 4, 10 };
var b = new[] { 1, 3, 3, 5, 10, 11 };
// 2N 次数组访问,数组 a 和数组 b 各遍历一遍
for (int i = 0, j = 0; i < a.Length && j < b.Length;)
{
if (a[i] < b[j])
{
i++;
}
else if (a[i] > b[j])
{
j++;
}
else
{
Console.WriteLine($"Common Element:{a[i]}, First index: (a[{i}], b[{j}])");
i++;
j++;
}
}