有一个整数数组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)
答案 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
。