📅  最后修改于: 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;
}
本题通过暴力枚举的方式解决,时间复杂度较高。如果有更高效的解法,欢迎在评论区中交流。