我在这个论坛找到了这个面试问题:http://geeksforgeeks.org/forum/topic/check-for-triangular-triplet
我正在复制下面的描述(礼貌geeksforgeeks.org和原始海报Kapil)
给出了由N个整数组成的零索引向量A.
三元组(P,Q,R)是三角形if和
A[P] + A[Q] > A[R],
A[Q] + A[R] > A[P],
A[R] + A[P] > A[Q].
例如,考虑向量A,
A[0] = 10 A[1] = 2 A[2] = 5
A[3] = 1 A[4] = 8 A[5] = 20
三联体(0,2,4)是三角形。
编写程序:
int triangle(const vector<int> &A);
这样,给定一个由N个整数组成的向量A,如果该向量存在一个三角形三元组,则返回1,否则返回0。
编辑:不应修改输入向量。并且有一个O(1)空间要求,所以我们不能复制数组!
假设:
N是[0..100,000]范围内的整数; 向量A的每个元素都是[-2,147,483,648..2,147,483,647]范围内的整数。
例如,给定矢量A使得
A[0] = 10 A[1] = 2 A[2] = 5
A[3] = 1 A[4] = 8 A[5] = 20
该函数应返回1,如上所述。
另一个例子:
给定矢量A
A[0] = 10 A[1] = 50 A[2] = 5
A[3] = 1
该函数应返回0.
预期的最坏情况时间复杂度:O(n log n) 预期的最坏情况空间复杂度:O(1)
清楚地排序数组不是一种选择。关于如何解决这个问题的任何想法?