Featured image of post 2475. 数组中不等三元组的数目

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

题目描述

给你一个下标从 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

解法一:暴力

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func unequalTriplets(nums []int) int {
    n := len(nums)
    ans := 0
    for i := 0; i < n-2; i++ {
        for j := i + 1; j < n-1; j++ {
            for k := j + 1; k < n; k++ {
                if nums[i] != nums[j] && nums[i] != nums[k] && nums[j] != nums[k] {
                    ans++
                }
            }
        }
    }
    return ans
}

解法二:排序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func unequalTriplets(nums []int) int {
    sort.Ints(nums)
    n := len(nums)
    res := 0
    for i, j := 0, 0; i < n; i = j {
        for j < n && nums[j] == nums[i] {
            j++
        }
        res += i * (j - i) * (n - j)
    }
    return res
}

解法三:哈希表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func unequalTriplets(nums []int) int {
    count := make(map[int]int)
    n := len(nums)
    for _, num := range nums {
        count[num]++
    }
    prev, res := 0, 0
    for _, cnt := range count {
        res += prev * cnt * (n - prev - cnt)
        prev += cnt
    }
    return res
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/06/13 20:10:23
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计