给出长度为n的整数的数组A。在排序数组A中,在(小o)o(nlogn)中对A进行排序,每两个连续的元素相差k1,k2,k3,其中k1,k2,k3
是不同的自然数。
我在解决此问题时遇到问题,我尝试在A上找到最小值 然后制作三个新数组,每个数组均以长度为n的min {A}开头,从而在每个数组中使用k1,k2,k3形成算术序列。合并结果并删除每个元素的重复副本,最后在长度为3n的新排序数组中的max {A}之后剪切所有元素。所有操作都是O(n)
。
问题是当max {A} -min {A}之间的差值不起作用时 不能被任何k1,k2,k3整除
。
任何帮助或见识将不胜感激。
答案 0 :(得分:4)
使用数组中的数字作为节点创建有向图。对于每个数字x
,如果存在x + k1,k2,k3
中的任何一个,则添加有向边。
现在进行简单的拓扑排序。
拓扑排序需要O(V + E)
时间。在这里,V = n
和E <= 3 * n
。因此,拓扑排序的时间为O(n)
。也可以使用哈希表在线性时间内检查x+k1,k2,k3
是否存在。
总体时间复杂度:O(n)
。
另一种解决问题的方法:
找到数组中的最小数字。设数字为x。这是排序数组的第一个元素。现在,检查数组中是否存在x+k1
,x+k2
或x+k3
。然后,根据给定条件,数组中必须至少存在一个。其中最小的是排序数组的第二个元素。重复这些步骤,直到没有元素为止。
每个步骤都需要3
个存在查询,并且有n
个步骤。有了哈希表,该算法将是线性的。
答案 1 :(得分:0)
这个问题对我来说并不明确,由于我无法发表澄清的意见,我假设有两种情况,并回答了两种情况。
场景1:在您的问题中,排序表示我们理解的排序是(升序还是降序):
在这种情况下,您无需检查连续元素是否具有k1,k2或k3之差就可以了。
场景2:在您的问题中,已排序是指以某种方式重新排列给定的数组元素,以使连续元素之间的差异为k1,k2或k3。>
示例: 输入:[1、2、4、5、10],k1:1,k2:3,k3:6
输出:[1、2、5、4、10]
在那种情况下,这是一个哈密顿路径查找问题,可以使用DFS解决此问题。首先,从给定的数组构造一个图。图的构建逻辑如下:
下一步是找出图中所有N个节点的长度为N的路径。
场景2的复杂性
这是一个NP完全问题。