我遇到了一个问题,但无法获得比O(m X n)更好的方法
2D数组包含逐列排序的数组,有没有办法从每列中选择一个元素并创建一行,以使该行中最大和最小元素的差异最小。例如
A = 1 2 5
3 4 15
7 11 17
答案应该是2,因为你可以从第一个col中选择3个,从第二个中选择4个,从第三个中选择5个,使第3行4 5 5个最大 - 最小值2。
有没有办法在O(Row * Col)
中得到它Ps:它不是来自任何正在进行的比赛。
答案 0 :(得分:1)
O(m*n)
的运行时实际上是线性的,因为输入中有m*n
个元素。在子线性运行时绑定中,不可能读取每个元素,这意味着如果没有额外的假设,所描述的算法在运行时复杂性方面是最优的。
答案 1 :(得分:1)
(懒得在行中使用最大和最小条目之间的差异,我会称之为范围。)
有很多特殊情况可以利用,其中一个特殊情况会导致每个条目的明显琐碎最坏情况和一个相同的值,其中每一行的范围为0:当找到0的范围时寻找较低的一个是过分的
我建议在最坏的情况下,矩阵填充行首先连续值“和最后一个周围的额外空间” - 每行开始一列
1 2 3 5
11 7 8 9
15 17 13 14
,每个行的范围相同,可能的范围较小(即使禁止重复),我也看不到如何避免检查每个条目。首先,我最喜欢的“技巧”不起作用:
对于新发现的最小候选范围,请分别查看包含最小和最大条目的列中的下一个值:虽然差异不会低于候选项,但范围不能,可以跳过行。 (连续使用相同值的另一个机会 - 请在问题中指明是否允许它们。)
然后,有一些列以在所有其他列的最后一个值之后排序的值开始:这些列贡献行最大值(假设升序)。同样,具有最后一个值的列将在每个其他的第一个值之前提供行最小值。 (对于唯一值,较弱的条件就足够了。)