检查n
整数数组是否包含3个可形成三角形的数字(即两个数字中任何一个的总和大于第三个数字的总和)。
显然,这可以在O(n)
时间内完成。
(明显的O(n log n)
解决方案是对数组进行排序,所以请不要)
答案 0 :(得分:3)
很难想象N个数字(其中N中等大),因此没有三角形三元组。但我们会尝试:
考虑一个不断增长的序列,其中每个下一个值都在极限N[i] = N[i-1] + N[i-2]
。除了斐波那契序列之外别无他法。近似地,它可以被视为具有黄金比率因子的几何级数(GRf~ = 1.618)
可以看出,如果N_largest < N_smallest * (GRf**(N-1))
那么肯定会有一个三角形三联体。由于浮点与整数以及由于GRf,这个定义非常模糊,这是一个限制而不是实际的几何因子。无论如何,仔细实施它将给出一个O(n)测试,可以检查是否确定三元组。如果没有,那么我们必须进行一些其他测试(仍在思考)。
编辑:斐波那契思想的直接结论是,对于整数输入(如Q中所述),如果大小为任何可能的输入,将存在一个保证的解决方案数组将大于log_GRf(MAX_INT)
,32位为47或64位为93。实际上,我们可以使用输入数组中的最大值来更好地定义它。
这为我们提供了以下算法:
步骤1)从输入数据中找到MAX_VAL:O(n)
步骤2)计算保证解决方案存在的最小数组大小:
N_LIMIT = log_base_GRf(MAX_VAL)
:O(1)
步骤3.1)如果N> N_LIMIT:返回true
:O(1)
步骤3.2)否则排序并使用直接方法O(n*log(n))
因为对于N的大值(并且这是复杂性很重要的唯一情况),O(n)
(或O(1)
}的情况下甚至是N > log_base_GRf(MAX_INT)
,我们可以说它是{ {1}}。