0

可能重复:
interviewstreet Triplet 挑战

有一个整数数组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)
4

1 回答 1

0

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


问题是,您在这里并不需要大量编程。这更像是一个数学问题。

首先,一个整数出现 1 次、2 次或更多次都没有关系。无论如何,由此产生的三胞胎一定是独一无二的。这简化为仅计算数组中有多少不同的整数。命名该变量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

于 2012-12-24T09:19:52.973 回答