跳到主要内容

2475.数组中不等三元组的数目

· 阅读需 3 分钟

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;
};