【发布时间】:2011-07-20 10:59:24
【问题描述】:
我一直在解决以下面试练习题:
我要写一个函数:
int triangle(int[] A);
如果存在一个三元组 (P, Q, R) 使得0 < P < Q < R < N 组成,那么给定一个由N 组成的零索引数组A 返回1。
A[P] + A[Q] > A[R],
A[Q] + A[R] > A[P],
A[R] + A[P] > A[Q].
如果这样的三元组不存在,函数应该返回0。假设0 < N < 100,000。假设数组的每个元素都是[-1,000,000..1,000,000]范围内的整数。
例如,给定数组A,这样
A[0]=10, A[1]=2, A[2]=5, A[3]=1, A[4]=8, A[5]=20
该函数应返回1,因为三元组(0, 2, 4) 满足所有必需条件。
对于数组A 这样
A[0]=10, A[1]=50, A[2]=5, A[3]=1
函数应该返回0。
如果我执行三重循环,这将非常非常慢(复杂性:O(n^3))。我在想也许可以用来存储数组的额外副本并对其进行排序,并对特定数字使用二进制搜索。但我不知道如何解决这个问题。
有什么想法吗?
【问题讨论】:
-
(0, 2, 4) 不适合:0 + 2 不 > 4。
-
他提到索引号作为答案... 10 , 5 , 8
-
第一个条件是指PR Q的值还是索引?因为,如果 P
-
这怎么能被标记为
painless?