1 问题描述
给定一个长度为 N 的数组A=[A1,A2,⋅⋅⋅,AN],数组中有可能有重复出现的整数。
现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,AN。
当修改Ai 时,小明会检查 Ai 是否在 A1 ∼Ai−1 中出现过。如果出现过,则小明会给 Ai 加上 1 ;如果新的Ai 仍在之前出现过,小明会持续给 Ai 加 1 ,直 到 Ai 没有在 A1 ∼ Ai−1 中出现过。
当 AN 也经过上述修改之后,显然 A 数组中就没有重复的整数了。
现在给定初始的 A 数组,请你计算出最终的 A 数组。
输入描述
第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。
其中,1≤N≤105,1≤Ai≤106。
输出描述
输出 N 个整数,依次是最终的 A1,A2,⋅⋅⋅,AN。
输入输出样例
示例
输入
5
2 1 1 3 4
输出
2 1 3 4 5
2 问题分析
输入的数组为A[i]
找到A[i]元素父亲
如果A[i]元素没有找到 则返回A[i]的值 同时将下一次查到A[i]值指向A[i]值得下一位
如果A[i]找到 则继续增加
2 1 1 3 4
首先2 的父亲是2 并同时把父亲数组中A[i]位置元素修改为3
其次为1 1的父亲是1 同时把父亲数组中1位置元素修改为2
获得 1 1的父亲此时为3 输出3 并将3的父亲修改为4
获得3 3的父亲此时为4 输出4 并将此时3的父亲修改为5
获得4 4的父亲此时为5 输出5 并将此时5的父亲修改为6
3 代码求解
import os
import sys
# 请在此输入您的代码
# 并查集 用于处理元素分组 管理一些不相交的集合 如血姻关系
def find(x):
global fa
if fa[x] != x:
fa[x] = find(fa[x])
return fa[x]
N = int(input())
A = [int(temp) for temp in input().strip().split()]
# 首先创建数组大小的并查集序列 自循环
fa = [i for i in range(1000001)]
for i in range(N):
A[i] = find(A[i])
fa[A[i]] = find(A[i] + 1)
for i in range(N):
print(A[i], end="")
if i != N - 1:
print(" ", end="")