给出一个整数a1,a2,...,an的列表,编写一种算法,检查是否存在对ai,aj以使ai-aj =M。算法的时间复杂度应为O(nlogn ) 或更好。 就我而言,当问题为ai + aj = M时,这个问题很容易解决。但是当条件是ai-aj = M时,我现在很麻烦。
答案 0 :(得分:0)
您可以使用两种分治法来解决这个问题。
首先,使用合并排序(O(logn))对集合进行排序。
然后,您可以一个一个地查看ai元素,并查看将成为aj的M-ai是否是一个元素。由于数组已排序,因此您可以运行二进制搜索,这也是一种分而治之的算法,并且以O(logn)运行。在最坏的情况下,您将需要执行n次,对于列表中的每个元素一次。
因此,该算法的运行时间为O(logn + n * logn)= O(nlogn)