1、题干
给你一个下标从 0 开始的正整数数组 nums
。请你找出并统计满足下述条件的三元组 (i, j, k)
的数目:
0 <= i < j < k < nums.length
nums[i]
、nums[j]
和nums[k]
两两不同 。- 换句话说:
nums[i] != nums[j]
、nums[i] != nums[k]
且nums[j] != nums[k]
。
- 换句话说:
返回满足上述条件三元组的数目。
示例 1:
输入:nums = [4,4,2,4,3]
输出:3
解释:下面列出的三元组均满足题目条件:
- (0, 2, 4) 因为 4 != 2 != 3
- (1, 2, 4) 因为 4 != 2 != 3
- (2, 3, 4) 因为 2 != 4 != 3
共计 3 个三元组,返回 3 。
注意 (2, 0, 4) 不是有效的三元组,因为 2 > 0 。
示例 2:
输入:nums = [1,1,1,1,1]
输出:0
解释:不存在满足条件的三元组,所以返回 0 。
提示:
3 <= nums.length <= 100
1 <= nums[i] <= 1000
2、思路
- 枚举:3重循环枚举所有不等三元组
- 哈希表:对数组所有元素计数,枚举累计所有不等三元组
3、代码
use std::collections::HashMap;
impl Solution {
pub fn unequal_triplets(nums: Vec<i32>) -> i32 {
let len = nums.len();
let mut map = HashMap::new();
for n in nums {
let c = map.entry(n).or_insert(0);
*c += 1;
}
let mut ans = 0;
let mut pc = 0;
for (k, c) in map {
ans += pc * c * (len - pc - c);
pc += c;
}
return ans as i32;
}
}
function unequalTriplets(nums: number[]): number {
const map = new Map<number, number>();
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], (map.get(nums[i]) || 0) + 1);
}
let ans = 0, pc = 0;
for (const [_, c] of map) {
ans += pc * c * (nums.length - pc - c);
pc += c;
}
return ans;
};
function unequalTriplets(nums: number[]): number {
let ans = 0;
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
for (let k = j + 1; k < nums.length; k++) {
if (nums[i] !== nums[j] && nums[i] !== nums[k] && nums[j] !== nums[k]) ans += 1;
}
}
}
return ans;
};