📜  门| GATE-CS-2007 |第 81 题(1)

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

GATE-CS-2007 Question 81

本题是 GATE-CS-2007 的第 81 题。该题目要求程序员完成一个函数,在数组中查找第一个重复的元素并返回该元素的索引。如果没有重复的元素,则返回 -1。

函数签名
def find_first_duplicate(arr: List[int]) -> int:
    pass
参数说明

参数 arr 是一个整数数组。数组的长度为 $n$,$1 \leq n \leq 10^6$,数组元素的取值范围是 $1 \leq arr[i] \leq n$。

返回值说明

如果数组中存在重复元素,则返回第一次出现重复的元素的索引(从 0 开始计数)。如果数组中不存在重复元素,则返回 -1。

示例
assert find_first_duplicate([1, 2, 3, 2, 1]) == 1
assert find_first_duplicate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2]) == 1
assert find_first_duplicate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) == -1
解题思路

本题可以采用桶排序的思想,以空间换时间。新建一个桶(长度为 $n$),遍历数组,将每个元素放入对应的桶中。如果下一个元素需要放入的桶已经有元素了,说明找到了重复元素,直接返回其索引。如果遍历完整个数组还没找到重复元素,则返回 -1。时间复杂度是 $O(n)$,空间复杂度是 $O(n)$。

参考实现
from typing import List

def find_first_duplicate(arr: List[int]) -> int:
    n = len(arr)
    freq = [0] * n
    for i in range(n):
        if freq[arr[i] - 1] == 1:
            return i
        freq[arr[i] - 1] = 1
    return -1