首页 > 其他分享 >修改数组

修改数组

时间:2023-08-02 19:12:26浏览次数:34  
标签:arr return int 累加 修改 num 数组 input

传送门

思路

首先想到的是用一个集合来记录出现过的数字,每次每次查询的时间复杂度为O(1),本来以为可以直接过的,没想到只能拿到40分

n = int(input())
arr = [int(n) for n in input().split()]
# 用来记录出现过的数字
s = set()

for i in range(n):
	# 一直累加,直到没有出现过
    while arr[i] in s:
        arr[i] += 1
    s.add(arr[i])

print(' '.join(map(str, arr)))

其实问题出在让数字累加的部分,\(A_i\)只能一个一个的累加,但其实完全可以让\(A_i\)跳跃着累加

使用一个列表S求出\(A_i\)应该改为多少(其实就是并查集)

例如,对于样例

6
2 1 1 1 3 4

刚开始列表S为(第一行为下标,第二行是值)

0 1 2 3 4 5 6
0 1 2 3 4 5 6

其中的值可以看作指针,指向一个新的下标(默认指向自己),对应的并查集为

遍历第一个元素2,根据S,S[2] == 2,指向自身,直接可以输出2,然后让S[2] = 3,这样下次遇到2的时候就可以通过S找到3

以此类推,当遍历到第三个1的时候,S为

0 1 2 3 4 5 6
0 4 3 4 4 5 6

此时对应的并查集为

根据S[1] == 4,我们可以直接输出4,不需要让1累加3次

def find(num):
    # 如何指向自身,返回
    if s[num] == num:
        # 指向下一个元素
        s[num] = num + 1
        return num
    to_return = find(s[num])
    # 路径压缩
    s[num] = to_return + 1
    return to_return


n = int(input())
arr = [int(n) for n in input().split()]
s = [i for i in range(10 ** 6 + 1)]

for i in range(n):
    arr[i] = find(s[arr[i]])

print(' '.join(map(str, arr)))

标签:arr,return,int,累加,修改,num,数组,input
From: https://www.cnblogs.com/mengzhuo/p/17601536.html

相关文章

  • 修改Keil uvison4 字体样式
    1.点击扳手配置2.点击Colors&Fonts,选择其中的8051:EditorCFiles,选择Text,点击右侧的CourierNew...3.在里面就可以调节字体了......
  • 重构之Divergent Change(发散式变化)&Shotgun Surgery (散弹式修改)
    5.DivergentChange发散式变化描述:一个类被锚定了多个变化,当这些变化中的任意一个发生时,就必须对类进行修改。解释:一个类最好只因一种变化而被修改操作:你应该找出某特定原因而造成的所有变化,然后运用ExtractClass将它们提炼到另一个类中。6.ShotgunSurgery散弹式修改描述:一种变化......
  • C语言逆向——数组和结构体,数组多维只是一个编译构造的假象,本质会转成一维数组,结构体
    数组数组是C语言中非常重要的一个概念,学习C语言主要就是两个知识点:数组、指针,学好这两个,那么你的C语言一定也会很好。什么是数组?或者说什么情况下我们需要使用数组,比如说我们需要定义一个人的年龄,我们可以定义一个变量来表示,但是如果我们需要定义三个人的年龄呢?那就需要三个变量来......
  • LeetCode 热题 100 之 189. 轮转数组
    题目给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例2:输入:nums=......
  • 安防视频监控平台EasyCVR修改参数提示database or disk is full的原因排查
    EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等能力。视频监控综合管理平台EasyCVR具备视频汇聚融合能力,平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,......
  • 奇迹MU商店宝石装备价格修改方法
    今天拿奇迹商店石头价格修改做示范:1.修改服务端的GS文件,用UE查找祝福宝石的十六进制价格代码,比如游戏商店里的祝福宝石价格是100000,转换成十六进制就是A08601,找到这个代码后将它改成你想要的价格就可以了,如我的是5000000,就改成404B4C 2.修改客户端的main.exe文件,还是用UE搜......
  • 数组去重的方法
    1、双重for循环+splice()思路:数组的splice()方法删除当前重复元素,第一个参数是开始的值,第二个参数是需要删除的个数。letarr=["a","the","a","b","test","good","the","a","good","a"]......
  • PHPHashtable 如何优化数组查找和排序
    PHPHashtable如何优化数组查找和排序PHP是一种高度流行的编程语言,被广泛用于web开发。它有很多的优点,例如易于学习、跨平台、简单易用的语法等等。而在PHP中,数组是一种非常常用的数据结构,它可以存储一组有序的数据,方便我们进行各种操作。PHPHashtable如何优化数组查找和排......
  • vue--day50--todolist案例自定义事件修改footer 和header 修改
    1.MyHeader.vue<template><divclass="todo-header"><!--v-model:="title"是实时绑定的--><inputtype="text"placeholder="请输入你的任务名称,回车键确认"v-model="title"@keyup.enter="add"/>......
  • 后缀数组(SA)做题记录
    SA真的是个好东西,好呀好东西。基础定义:$sa$数组:后缀排序后排名为$i$的后缀的起始位置下标。$rk$数组:起始下标为$i$的后缀的排名。$height$数组:后缀排序后排名为$i$和$i-1$的最长公共前缀长度(Lcp)模板:(小bug:在SA代码charch[N];structSuffix_Array{llm=......