原题
n根长度不一的棍子,判断是否有三根棍子可以构成三角形,并且找到周长最长的三角形。
分析
首先能够构成三角形的三根棍子需要满足什么条件呢?这个简直就是常识了:
最长棍子的长度 < 另外两根棍子的长度和
这是重要条件。
那么接下来该怎么办呢?暴力法——不要总觉得这是耻辱,要这样想:这是一个好开端。三条边,三层循环。时间复杂度为O(n^3)。这在一般的题目中,都是无法接受的。如何改进的呢?棍子有长有短,我们要找到的是周长最长的。
我们可以对棍子的长度,从大到小排序。从最长的开始找符合构成三角形条件的。找到的第一个就是周长最长的。
下面我们来说明,为什么第一个找到的,就是最长的。假设我们有如下长度的棍子,并且长度一次递减。
a | b | c | d | e | f | g |
假设opq是第一个可以构成三角形的棍子,假设还存在xyz,构成三角形,且,x+y+z > o + p + q, 因为opq是第一个三角形,则x<=o。则y+z > p+q,任取y、z,则可以找到,o,y,z为一个三角形,周长大于opq,并且,这个三角形,在opq之前找到(因为y或者z,大于p或者q,先遍历到)。这个与adf是第一个的假设是矛盾的。所以,不存在xyz构成三角形,周长大于adf。
那么如果找到第一个能够构成三角形的三根棍子呢?现在棍子的长度已经是排序的。
a | b | c | d | e | f | g |
很明显,我们只需要依次考虑,相邻三个元素是否能够构成三角形即可。因为,如果acd构成三角形,abc一定是,而且,周长还要更长。所以这里O(n),就可以找到周长最长的三角形。前面排序是O(nlogn)。则,总的时间复杂度是O(nlogn).