给你一个下标从 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
方法一:暴力枚举
我们可以直接枚举所有的三元组
时间复杂度 nums
的长度。
方法二:排序 + 枚举中间元素 + 二分查找
我们可以先对数组 nums
进行排序。
然后遍历 nums
,枚举中间元素
时间复杂度 nums
的长度。
方法三:哈希表
我们还可以使用哈希表 nums
中每个元素的数量。
然后遍历哈希表
时间复杂度 nums
的长度。
class Solution:
def unequalTriplets(self, nums: List[int]) -> int:
n = len(nums)
ans = 0
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
ans += nums[i] != nums[j] and nums[j] != nums[k] and nums[i] != nums[k]
return ans
class Solution:
def unequalTriplets(self, nums: List[int]) -> int:
nums.sort()
ans, n = 0, len(nums)
for j in range(1, n - 1):
i = bisect_left(nums, nums[j], hi=j) - 1
k = bisect_right(nums, nums[j], lo=j+1)
ans += (i >= 0 and k < n) * (i + 1) * (n - k)
return ans
class Solution:
def unequalTriplets(self, nums: List[int]) -> int:
cnt = Counter(nums)
n = len(nums)
ans = a = 0
for b in cnt.values():
c = n - a - b
ans += a * b * c
a += b
return ans
class Solution {
public int unequalTriplets(int[] nums) {
int n = nums.length;
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
if (nums[i] != nums[j] && nums[j] != nums[k] && nums[i] != nums[k]) {
++ans;
}
}
}
}
return ans;
}
}
class Solution {
public int unequalTriplets(int[] nums) {
Arrays.sort(nums);
int ans = 0, n = nums.length;
for (int j = 1; j < n - 1; ++j) {
int i = search(nums, nums[j], 0, j) - 1;
int k = search(nums, nums[j] + 1, j + 1, n);
if (i >= 0 && k < n) {
ans += (i + 1) * (n - k);
}
}
return ans;
}
private int search(int[] nums, int x, int left, int right) {
while (left < right) {
int mid = (left + right) >> 1;
if (nums[mid] >= x) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}
class Solution {
public int unequalTriplets(int[] nums) {
Map<Integer, Integer> cnt = new HashMap<>();
for (int v : nums) {
cnt.put(v, cnt.getOrDefault(v, 0) + 1);
}
int ans = 0, a = 0;
int n = nums.length;
for (int b : cnt.values()) {
int c = n - a - b;
ans += a * b * c;
a += b;
}
return ans;
}
}
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
int n = nums.size();
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
if (nums[i] != nums[j] && nums[j] != nums[k] && nums[i] != nums[k]) {
++ans;
}
}
}
}
return ans;
}
};
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int ans = 0, n = nums.size();
for (int j = 1; j < n - 1; ++j) {
int i = lower_bound(nums.begin(), nums.begin() + j, nums[j]) - nums.begin() - 1;
int k = upper_bound(nums.begin() + j + 1, nums.end(), nums[j]) - nums.begin();
if (i >= 0 && k < n) {
ans += (i + 1) * (n - k);
}
}
return ans;
}
};
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
unordered_map<int, int> cnt;
for (int& v : nums) ++cnt[v];
int ans = 0, a = 0;
int n = nums.size();
for (auto& [_, b] : cnt) {
int c = n - a - b;
ans += a * b * c;
a += b;
}
return ans;
}
};
func unequalTriplets(nums []int) (ans int) {
n := len(nums)
for i := 0; i < n; i++ {
for j := i + 1; j < n; j++ {
for k := j + 1; k < n; k++ {
if nums[i] != nums[j] && nums[j] != nums[k] && nums[i] != nums[k] {
ans++
}
}
}
}
return
}
func unequalTriplets(nums []int) (ans int) {
sort.Ints(nums)
n := len(nums)
for j := 1; j < n-1; j++ {
i := sort.Search(j, func(h int) bool { return nums[h] >= nums[j] }) - 1
k := sort.Search(n, func(h int) bool { return h > j && nums[h] > nums[j] })
if i >= 0 && k < n {
ans += (i + 1) * (n - k)
}
}
return
}
func unequalTriplets(nums []int) (ans int) {
cnt := map[int]int{}
for _, v := range nums {
cnt[v]++
}
a, n := 0, len(nums)
for _, b := range cnt {
c := n - a - b
ans += a * b * c
a += b
}
return
}