📌  相关文章
📜  数组中具有相等元素的索引对的计数 | 2套(1)

📅  最后修改于: 2023-12-03 14:54:58.843000             🧑  作者: Mango

数组中具有相等元素的索引对的计数

本题有两套解法,分别介绍如下。

解法一
思路

遍历数组中的所有元素,将数组中每个元素及其下标都加入一个字典中。若当前元素在字典中出现过,则说明找到了一对相等的元素,将对应的下标对计入答案。

代码
def count_same_index_pairs(nums):
    cnt = 0
    num_index = {}
    for i in range(len(nums)):
        if nums[i] in num_index:
            cnt += len(num_index[nums[i]])
            num_index[nums[i]].append(i)
        else:
            num_index[nums[i]] = [i]
    return cnt
复杂度分析

时间复杂度:$O(n)$,其中 $n$ 为数组的长度。

空间复杂度:$O(n)$,用于存储字典。

解法二
思路

先将数组排序,然后从头遍历数组,对于当前的元素 $nums[i]$,在已经遍历过的元素中查找是否有和 $nums[i]$ 相等的元素,若有则将下标对计入答案。

代码
def count_same_index_pairs(nums):
    cnt = 0
    nums_sorted = sorted(enumerate(nums), key=lambda x: x[1])
    for i in range(len(nums_sorted)):
        for j in range(i + 1, len(nums_sorted)):
            if nums_sorted[i][1] != nums_sorted[j][1]:
                break
            if nums_sorted[i][0] > nums_sorted[j][0]:
                cnt += 1
    return cnt
复杂度分析

时间复杂度:$O(n\log n)$,其中 $n$ 为数组的长度,主要花费在排序上。

空间复杂度:$O(n)$,用于存储新数组。