📅  最后修改于: 2023-12-03 14:58:27.673000             🧑  作者: Mango
本题是 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