📜  数组中唯一对的数量(1)

📅  最后修改于: 2023-12-03 15:10:21.613000             🧑  作者: Mango

数组中唯一对的数量

介绍

在一个整数数组中,如果两个数对 (i, j) 满足以下条件中的任意一条,我们就将其称为 唯一对

  • 0 <= i < j < nums.length
  • nums[i] < nums[j]
  • nums[k]nums[i]nums[j] 中的首个元素,其中 i < k < j

给定一个整数数组 nums,请返回其中唯一对的数量。

解法

对于数组中每一个数,我们可以依次向前遍历,尝试找到所有小于它的数。对于每一个小于它的数,我们都可以找到一个合法的唯一对 (i, j),其中 nums[i] 就是这个数,nums[j] 就是我们现在正在遍历的数。

具体来说,我们使用一个数组 smaller 记录每个数前面有多少个比它小的数,那么对于一个数 nums[j],小于它的数的数量就是 smaller[j],要找到所有小于它的数,我们只需要在 [0, j-1] 的范围内找到所有的小于 nums[j] 的数即可。对于 [0, j-1] 中的每一个数,如果它小于 nums[j],那么就找到了一个合法的唯一对 (i, j),对答案进行累加。

时间复杂度为 $O(n^2)$,空间复杂度为 $O(n)$。

代码
def unique_pairs(nums):
    n = len(nums)
    smaller = [0] * n
    for i in range(n):
        for j in range(i):
            if nums[j] < nums[i]:
                smaller[i] += 1
    
    ans = 0
    for j in range(n):
        for i in range(j):
            if nums[i] < nums[j]:
                ans += smaller[i]
    
    return ans
int uniquePairs(vector<int>& nums) {
    int n = nums.size();
    vector<int> smaller(n, 0);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[j] < nums[i]) {
                smaller[i]++;
            }
        }
    }
    
    int ans = 0;
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < j; i++) {
            if (nums[i] < nums[j]) {
                ans += smaller[i];
            }
        }
    }
    
    return ans;
}
总结

本题通过暴力枚举的方式解决,时间复杂度较高。如果有更高效的解法,欢迎在评论区中交流。