在数组中找到最少两个非边,非相邻条目

时间:2014-09-16 17:28:37

标签: algorithm

我有以下问题

在数组中找到最小的两个非相邻值,这样这些元素中没有一个在数组边缘(没有A [0]而没有A [n-1]) 算法的运行时应为O(n)

我首先考虑对数组进行排序,但排序会花费O(nlogn) 忽略这个事实一秒钟,如果我们对数组进行排序,我们不能只取前两个值,因为它们可能违反上述条件?然后什么?采取下一个元素并尝试,如果不采取下一个,我不能在那里看到一个简单的解决方案

另一个解决方案是生成所有允许的对并找到具有最小总和的对。但找到所有对成本为O(n ^ 2)

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

在线性时间内,从{1}到i找到i最小的条目(不包括第一个和最后一个)。最好的可能性是一对。如果1和2不相邻,那么这是最好的。否则,如果1和3不相邻,那么这是最好的。否则,2和3接壤1(因此不是彼此),可能性为1和4,或2和3。

答案 1 :(得分:0)

你可以首先使用你的排序,然后,除非我遗漏了某些东西,否则取出元素0和2.这些将是最小的非相邻值。

只要数组是3个元素或更大,你应该确保位置0和2中的元素值是最小的(如果你需要它们,非连续的)以及非相邻的元素值。阵列。

答案 2 :(得分:0)

如果您的数组已排序,您只需要继续比较备用元素(如索引(0,2),(1,3),(2,5))等等,然后找到最小的对区别。但是如果没有排序,你就是说运行时复杂度会变成O(n ^ 2),因为你必须将每个元素与数组中的每个其他元素进行比较。