Interviewstreet Triplet

时间:2012-12-24 08:55:56

标签: java

  

可能重复:
  interviewstreet Triplet challenge

有一个整数数组d,它不包含两个以上相同值的元素。有多少个不同的升序三元组(d[i] < d[j] < d[k], i < j < k)存在?

输入格式:

第一行包含一个整数N,表示数组中的元素数。接下来是一行包含由单个空格分隔的N个整数,没有前导/尾随空格

输出格式:

一个整数,表示数组中存在的不同上升三元组的数量

约束:

N <= 10^5

数组的每个元素最多出现两次

数组的每个元素都是32位正整数

示例输入:

6

1 1 2 2 3 4

示例输出:

4

解释

不同的三胞胎是

(1,2,3)
(1,2,4)
(1,3,4)
(2,3,4)

1 个答案:

答案 0 :(得分:0)

编辑:我认为整数是有序的,你的答案中没有提到。对于无序整数,无法进行优化,您必须使用强力计数方法。如果它们已排序,请继续阅读。


事实上,你真的不需要很多编程。这更像是一个数学问题。

首先,如果有一个,两个或更多的整数出现并不重要。无论如何,由此产生的三元组是独一无二的。这减少到仅计算阵列中有多少不同的整数。将变量命名为s

然后我们只应用以下公式:

result = 0;
for(first_index = 0; first_index < s; first_index++) {
    for(second_index = first_index + 1; second_index < s; second_index++) {
        result += s - second_index - 1;
    }
}
return result;

然而,这可以简化。现在,如果我们推测值s - second_index - 1需要一个外部循环,那就是从0到s - 2的所有整数的行都反转了!我们不高兴它的总和有一个公式:n是一个整数,n * (n + 1) / 2是第一个n整数的总和。

这意味着我们可以优化我们的计划:

result = 0;
for(first_index = 0; first_index < s; first_index++) {
    result += (s - 2 - first_index) * (s - 2 - first_index + 1) / 2;
}

请注意,我们可以进一步将其简化为result = (x^3 - 3*x^2 + 2*x) / 6