蓝桥杯 修改数组 python (并查集)

简介: 蓝桥杯 修改数组 python (并查集)

蓝桥杯 修改数组 python (并查集)


题目描述


给定一个长度为 N NN 的数组 A = [A 1 , A 2 , ⋅ ⋅ ⋅ , A N,数组中有可能有重复出现的整数。


现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A 2 , A 3 , ⋅ ⋅ ⋅ A N


当修改 A i 时,小明会检查$ A_i是 否 在 是否在是否在A_1 ∼ A_i−1$现过。如果出现过,则小明会给 A i 加上 1 ;如果新的 A i 仍在之前出现过,小明会持续给 A i 加 1 ,直 到 A i 没有在A 1 ∼ A i − 1  中出现过。


当 A N 也经过上述修改之后,显然 A AA 数组中就没有重复的整数了。


现在给定初始的 A AA 数组,请你计算出最终的 A AA 数组。


输入描述


第一行包含一个整数N

第二行包含 N 个整数 image.png

其中,image.png

输出描述


输出 N  个整数,依次是最终的 image.png

输入输出样例


示例


输入


5
2 1 1 3 4


输出

2 1 3 4 5

运行限制


  • 最大运行时间:1s
  • 最大运行内存: 256M


思路


简单的思路可以利用哈希表,类似于bool数组,如果出现了,就进行了+1得到一个,如果发生矛盾了就需要遍历整个数组,在复杂的情况下,就需要n方的复杂度,对于很大的数据这就不太现实。


可以利用并查集,这样我们得到数据就只需要O(1)就解决了


首先设置一个father数组,这个数组所有的元素都指向自身,f[i]表示当你访问到 i 个数时应该把他换成什么


一开始都是f[ i ] 指向i ,也就说明都没访问过


当你访问了 i 以后,就需要进行更新,更新f[i] = f[i+1]


因为有时候有些数据是重复的,所以当我们再次访问到i的时候,i已经输出过了,这时候我们需要输出的i+1


但是这也涉及一个问题,i+1也有可能输出过了,所以说我们就输出的是f[i+1]


代码code

# https://www.lanqiao.cn/problems/185/learning/
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 = list(map(int,input().split()))
# 首先创建数组大小的并查集序列 自循环 全部指向自己
fa = [i for i in range(1000001)]
for i in range(N):
    # 找到A[i]元素父亲
    # 如果A[i]元素没有找到 则返回A[i]的值 同时将下一次查到A[i]值指向A[i]指向下一位
    # 如果A[i]找到 则继续增加
    # 2 1 1 3 4
    # 首先2 的父亲是2 并同时把父亲数组中A[i]位置元素修改为3,也就是再遇到2的时候,换为3
    # 其次为1 1的父亲是1 同时把父亲数组中1位置元素修改为2
    # 获得1 1的父亲此时为3 输出3 并将3的父亲修改为4
    # 获得3 3的父亲此时为4 输出4 并将此时3的父亲修改为5
    # 获得4 4的父亲此时为5 输出5 并将此时5的父亲修改为6
    A[i] = find(A[i])
    fa[A[i]] = find(A[i] + 1) # 更新为下一个点指向的点
for i in range(N):
    print(A[i], end=" ")


相关文章
|
3月前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
158 0
|
3月前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
47 0
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
136 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
110 10
|
3月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
63 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
3月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
143 4
|
3月前
|
Python
智慧之光!Python并查集:点亮你的编程思维,让复杂问题迎刃而解!
并查集以其简洁而强大的功能,成为了解决特定类型问题的首选工具。在编程的旅途中,掌握并查集不仅能帮助我们解决眼前的难题,更能点亮我们的编程思维,让我们在面对更复杂的问题时也能游刃有余。希望今天的分享能激发你对并查集的兴趣,让你在未来的编程道路上走得更远、更稳。
37 1
|
3月前
|
存储 算法 Python
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
43 1
|
4月前
|
Python
逆天改命!掌握Python并查集,数据结构难题从此不再是你的痛!
在编程旅程中,遇到棘手的数据结构难题是否让你苦恼?别担心,Python并查集(Union-Find)是你的得力助手。这是一种高效处理不相交集合合并及查询的数据结构,广泛应用于网络连通性、社交网络圈子划分等场景。通过维护每个集合的根节点,它实现了快速合并与查询。本文将介绍并查集的基本概念、应用场景以及如何在Python中轻松实现并查集,帮助你轻松应对各种数据结构挑战。
43 3
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(二):Python组之基础练习三十题
蓝桥杯Python编程练习题的集合,包含了三十个不同难度的编程题目,覆盖了基础语法、数据结构和算法等领域。
63 0