1、题干
给你一个下标从 0 开始的正整数数组 nums 。请你找出并统计满足下述条件的三元组 (i, j, k) 的数目:
0 <= i < j < k < nums.lengthnums[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 <= 1001 <= 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;
};